/**
 * Base elements + reusable components. Token sheet: design/knit-design-system.html
 */

* { box-sizing: border-box; }
html { -webkit-font-smoothing: antialiased; scroll-behavior: smooth; }
body {
	margin: 0;
	background: var(--paper);
	color: var(--ink);
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.6;
}
img { max-width: 100%; height: auto; display: block; }
a { color: var(--accent-strong); }
::selection { background: var(--accent-soft); color: var(--accent-strong); }

.container {
	max-width: var(--container-width);
	margin: 0 auto;
	padding: 0 32px;
}
@media (max-width: 640px) {
	.container { padding: 0 20px; }
}

.section { padding: var(--space-2xl) 0; }
.section--tight { padding: var(--space-xl) 0; }
.section--bordered { border-bottom: 1px solid var(--border); }

h1, h2, h3, h4 {
	font-family: var(--font-display);
	font-weight: 700;
	letter-spacing: -0.01em;
	line-height: 1.25;
	text-wrap: balance;
	margin: 0 0 var(--space-md);
}
h1 { font-size: 44px; font-weight: 800; letter-spacing: -0.02em; line-height: 1.12; }
h2 { font-size: 30px; }
h3 { font-size: 20px; }
p { margin: 0 0 var(--space-md); max-width: 66ch; }
.eyebrow {
	font-family: var(--font-mono);
	font-size: 12.5px;
	color: var(--accent-strong);
	background: var(--accent-soft);
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 5px 10px;
	border-radius: 8px;
	margin-bottom: var(--space-md);
}
/* Gradient-filled headline text — the two-tone emphasis pattern
   (e.g. "<span class="text-accent">Ship every integration</span> your
   product needs"), built from our own accent gradient. */
.text-accent {
	background: var(--accent-gradient);
	-webkit-background-clip: text;
	background-clip: text;
	color: transparent;
}
/* Centers the pill itself (not just its text) as a block, regardless
   of surrounding text-align — width:fit-content keeps it sized to its
   content instead of stretching full-width like plain display:block would. */
.eyebrow--center { display: flex; width: fit-content; margin-left: auto; margin-right: auto; }

/* Keeps a short line (e.g. a section dek ending in a link) from wrapping
   awkwardly on desktop, while still allowing a normal wrap on narrow
   screens instead of forcing horizontal overflow. */
.text-nowrap { white-space: nowrap; }
@media (max-width: 640px) { .text-nowrap { white-space: normal; } }

/* ---- Buttons ---- */
.btn {
	font-family: var(--font-body);
	font-weight: 600;
	font-size: 14.5px;
	border-radius: var(--radius-pill);
	padding: 11px 22px;
	border: 1px solid transparent;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	text-decoration: none;
	transition: transform .12s ease, box-shadow .12s ease, background .12s ease, border-color .12s ease;
}
.btn:active { transform: translateY(1px); }
.btn-sm { padding: 7px 16px; font-size: 13px; }
.btn-primary { background: var(--cta); color: #fff; box-shadow: var(--shadow-sm); }
.btn-primary:hover { background: var(--cta-hover); box-shadow: var(--shadow-md); color: #fff; }
.btn-secondary { background: var(--white); color: var(--ink); border-color: var(--border); }
.btn-secondary:hover { border-color: var(--navy-300); }
.btn-ghost { background: transparent; color: var(--accent-strong); padding-left: 4px; padding-right: 4px; }
.btn-ghost:hover { text-decoration: underline; }
.btn-on-dark { background: var(--navy-900); color: #fff; }
.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ---- Badges ---- */
.badge {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 12px;
	font-weight: 600;
	padding: 4px 10px;
	border-radius: 100px;
}
.badge-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.badge-teal { background: var(--teal-100); color: #067A5E; }
.badge-teal .badge-dot { background: var(--teal-500); }
.badge-amber { background: var(--amber-100); color: #8A5A0B; }
.badge-amber .badge-dot { background: var(--amber-500); }
.badge-coral { background: var(--coral-100); color: #A83430; }
.badge-coral .badge-dot { background: var(--coral-500); }
.badge-green { background: var(--green-100); color: #146B48; }
.badge-green .badge-dot { background: var(--green-500); }
.badge-neutral { background: var(--navy-100); color: var(--ink-soft); }

/* ---- Cards ---- */
.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; }
/* Fixed 3-across variant (e.g. MCP Servers "Key Features": 6 cards as 2
   clean rows of 3, instead of auto-fit's width-dependent column count). */
.card-grid--3col { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 900px) { .card-grid--3col { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .card-grid--3col { grid-template-columns: 1fr; } }
/* Fixed 2-across variant (solution page: 2x2 feature grid, 2-card
   "Build Your Use Case" row) — same reasoning as --3col above. */
.card-grid--2col { grid-template-columns: repeat(2, 1fr); }
@media (max-width: 640px) { .card-grid--2col { grid-template-columns: 1fr; } }
/* Workflow recipe cards (hub, function/sub-category archives, "Related
   Workflows") -- plain auto-fit collapses empty tracks in a partial
   last row and hands their space to the real cards, so a row with
   fewer items renders visibly wider than a full row; auto-fill keeps
   the same column width regardless of how many cards end up in the
   last row, just leaving blank (not stretched) space instead. Height
   is fixed too, since these cards' only variable content (title +
   trimmed summary) otherwise makes each row a different height --
   350px comfortably fits the tallest real card at the grid's
   narrowest column width (measured live at ~343px, the longest actual
   title+summary combination among current posts), with a small buffer
   for future content. */
.wf-recipe-grid { grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
.wf-recipe-card { min-height: 350px; }
.card {
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	padding: 24px;
	box-shadow: var(--shadow-sm), var(--shadow-inset);
	transition: transform .16s ease, box-shadow .16s ease, border-color .16s ease;
}
a.card:hover, .card-grid a.card:hover {
	transform: translateY(-3px);
	box-shadow: var(--shadow-lg);
	border-color: var(--teal-400);
}
.card-icon {
	width: 42px; height: 42px;
	border-radius: 13px;
	background: linear-gradient(155deg, var(--accent-soft), var(--white));
	display: flex; align-items: center; justify-content: center;
	color: var(--accent-strong);
	margin-bottom: 16px;
}
/* Per-product accent — each of the three homepage products gets its
   own brand color (matching the live getknit.dev pattern) instead of
   a single uniform accent, so the trio reads as distinct at a glance. */
.card-icon--teal { background: var(--teal-500); color: #fff; }
.card-icon--amber { background: var(--amber-500); color: #fff; }
.card-icon--coral { background: var(--coral-600); color: #fff; }
.card h3 { margin: 0 0 8px; }
.card p { font-size: 14px; color: var(--ink-soft); margin: 0; line-height: 1.6; }
/* Text label for a.card links whose only content is a title — a bare
   <h3> inside an <a> trips wpautop's block-tag detection and corrupts
   the markup on save, so plain link-only cards use this instead. */
a.card { text-decoration: none; }
.card-link-label { display: block; font-family: var(--font-display); font-weight: 700; font-size: 16px; color: var(--ink); letter-spacing: -0.01em; }
a.card:hover .card-link-label { color: var(--accent-strong); }
/* Checklist — plan/partnership-type cards listing what's included,
   each row led by an accent check-circle icon instead of a bullet. */
.check-list { list-style: none; padding: 0; margin: 16px 0; display: flex; flex-direction: column; gap: 10px; }
.check-list li { display: flex; align-items: flex-start; gap: 10px; font-size: 14px; color: var(--ink-soft); line-height: 1.5; }
.check-list .knit-icon { color: var(--accent-strong); flex-shrink: 0; margin-top: 1px; }
.check-list--row { flex-direction: row; flex-wrap: wrap; column-gap: 28px; row-gap: 10px; }
/* Category grid (Unified API page "Explore by Category") — real app
   logos + a title that can be 1 or 2 lines depending on the category
   name. Both get a reserved min-height so a short 1-line card doesn't
   look tacked-on next to a 2-line sibling in the same row. */
.category-card { text-align: center; text-decoration: none; color: inherit; }
.category-card-logos { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 28px; margin-bottom: 14px; }
.category-card-logos img { height: 28px; width: 28px; object-fit: contain; border-radius: 6px; }
.category-card h3 { font-size: 16px; min-height: 40px; display: flex; align-items: center; justify-content: center; }
.category-card p { font-size: 13px; }
/* Same corruption risk applies to any block tag inside a.card, not just
   <h3> -- a <p> description on a link-card trips it too. This is the
   .card-link-label pattern extended to a second (body-copy) line: a
   <span> with display:block instead of a real <p>. */
.card-workflow-desc { display: block; margin-top: 10px; font-size: 14px; color: var(--ink-soft); line-height: 1.6; }
.workflow-card-logo { height: 34px; width: auto; max-width: 110px; object-fit: contain; }
.workflow-card-logo--text { font-family: var(--font-display); font-weight: 800; font-size: 19px; letter-spacing: -0.01em; }
.workflow-card-connector { flex-shrink: 0; color: var(--ink-soft); display: flex; }
/* Workflow showcase, marquee layout — rides the same .logo-marquee /
   .logo-marquee-row / .logo-marquee-row--reverse / .logo-marquee-track
   scaffolding as the homepage's app marquee (opposite-direction rows,
   hover-to-pause, seamless loop via duplicated row content), just with
   a bigger card in place of the small logo chip. The graphic strip is a
   direct full-width child of the card with its own background/padding
   (not bled via negative margin against a shared .card padding), so
   there's no padding-cancellation math that can drift out of alignment. */
.workflow-marquee-card {
	flex-shrink: 0;
	width: 300px;
	display: block;
	white-space: normal;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	overflow: hidden;
	text-decoration: none;
	box-shadow: var(--shadow-sm), var(--shadow-inset);
	transition: transform .16s ease, box-shadow .16s ease, border-color .16s ease;
}
.workflow-marquee-card:hover {
	transform: translateY(-3px);
	box-shadow: var(--shadow-lg);
	border-color: var(--teal-400);
}
.workflow-marquee-graphic {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 16px;
	background: linear-gradient(155deg, var(--navy-100), var(--white));
	padding: 26px 16px;
}
.workflow-marquee-body { display: block; padding: 16px 18px 18px; }
.workflow-card-connector svg { width: 18px; height: 18px; }
.knit-icon { display: block; }
/* .knit-icon's default display:block is fine floating alone in a fixed
   box (.card-icon, etc.), but it forces a block-level box -- full
   container width, not just its own 20px -- if it ever ends up as the
   last thing on a wrapped line of inline text (e.g. "label →" inside a
   centered, width-capped <p>), which visibly breaks that line's
   centering. Opt in per call site with this modifier rather than
   changing the shared default, which plenty of other icon placements
   rely on. */
.knit-icon--inline { display: inline-block; vertical-align: -3px; }

/* ---- Endpoint / API capability card ---- */
.endpoint-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 14px; align-items: start; }
.endpoint {
	background: var(--navy-900);
	color: #DCEFEA;
	border-radius: 16px;
	padding: 16px 18px;
	font-size: 13px;
	box-shadow: var(--shadow-md);
	min-width: 0; /* allow the grid item to shrink below its content's natural width */
	min-height: 112px; /* keeps a 1-line-description card from looking like a sliver next to a 2-line one in the same row */
}
.endpoint-head {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: 8px;
	font-family: var(--font-mono);
}
.endpoint .endpoint-method {
	color: var(--teal-400);
	font-weight: 600;
	background: rgba(76, 192, 172, 0.14);
	padding: 2px 7px;
	border-radius: 4px;
	font-size: 11.5px;
}
.endpoint .endpoint-label { color: #EDF3F6; font-weight: 600; }
.endpoint-desc {
	margin: 10px 0 0;
	color: #A9B9CC;
	font-size: 13px;
	line-height: 1.55;
	max-width: none;
	overflow-wrap: break-word;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden; /* caps outlier 3-line descriptions so one card doesn't blow out its whole row's height */
}

/* ---- Code sample block (product pages: real API request/response) ---- */
.code-sample {
	background: var(--navy-900);
	color: #DCEFEA;
	border-radius: var(--radius-card);
	padding: 20px 22px;
	overflow-x: auto;
	box-shadow: var(--shadow-lg);
	min-width: 0;
}
.code-sample-label {
	display: flex;
	align-items: center;
	gap: 8px;
	font-family: var(--font-mono);
	font-size: 12px;
	color: #A9B9CC;
	margin-bottom: 12px;
	flex-wrap: wrap;
}
.code-sample-label .endpoint-method {
	color: var(--teal-400);
	font-weight: 600;
	background: rgba(76, 192, 172, 0.14);
	padding: 2px 7px;
	border-radius: 4px;
	font-size: 11.5px;
}
.code-sample pre {
	margin: 0;
	font-family: var(--font-mono);
	font-size: 12.5px;
	line-height: 1.6;
	white-space: pre;
}
.code-sample code { color: inherit; }

/* ---- Forms ---- */
.field { display: flex; flex-direction: column; gap: 6px; }
.field label { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); }
.field input, .field textarea, .field select {
	font-family: var(--font-body);
	border: 1px solid var(--border);
	border-radius: 10px;
	padding: 10px 12px;
	font-size: 14.5px;
	background: var(--white);
	color: var(--ink);
}
.field input:focus, .field textarea:focus { outline: 2px solid var(--accent); outline-offset: 1px; }

/* ---- Book a Demo — custom form + split layout ---- */
.demo-split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2xl); align-items: start; }
@media (max-width: 900px) { .demo-split { grid-template-columns: 1fr; } }
.demo-form { display: flex; flex-direction: column; gap: 16px; }
.demo-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 480px) { .demo-form-row { grid-template-columns: 1fr; } }
.demo-form-phone-row { display: flex; gap: 8px; }
.demo-form-phone-country { flex: 0 0 110px; min-width: 0; }
.demo-form-phone-row input { flex: 1 1 auto; min-width: 0; }
.field.has-error input, .field.has-error select { border-color: var(--danger); }
.field-error { display: block; font-size: 12px; color: var(--danger); min-height: 0; }
.field.has-error .field-error { margin-top: 2px; }
.demo-form-consent { display: flex; align-items: flex-start; gap: 10px; font-size: 12.5px; color: var(--ink-soft); line-height: 1.5; cursor: pointer; }
.demo-form-consent input[type="checkbox"] { margin-top: 3px; flex-shrink: 0; width: 16px; height: 16px; accent-color: var(--accent-strong); }
.demo-form-consent a { color: var(--accent-strong); }
.demo-form-status { font-size: 13px; margin: 0; }
.demo-form-status.is-error { color: var(--danger); }
.demo-form-status.is-success { color: var(--teal-600, #067A5E); font-weight: 600; }
.demo-form-submit { width: 100%; justify-content: center; }
.demo-form[hidden] { display: none; }

.partner-form-wrap { max-width: 640px; margin: var(--space-lg) auto 0; text-align: left; }

/* ---- Meeting calendar modal (opens after a successful demo-form
   submission) ---- */
body.demo-meeting-modal-open { overflow: hidden; }
.demo-meeting-modal[hidden] { display: none; }
.demo-meeting-modal { position: fixed; inset: 0; z-index: 200; display: flex; align-items: center; justify-content: center; padding: 24px; }
.demo-meeting-modal-backdrop { position: absolute; inset: 0; background: rgba(0, 17, 43, .55); }
.demo-meeting-modal-panel { position: relative; z-index: 1; background: var(--white); border-radius: var(--radius-card); box-shadow: var(--shadow-lg); padding: var(--space-lg) var(--space-md) var(--space-md); width: 100%; max-width: 760px; max-height: 88vh; overflow-y: auto; }
.demo-meeting-modal-close { position: absolute; top: 10px; right: 12px; background: none; border: none; font-size: 26px; line-height: 1; color: var(--ink-soft); cursor: pointer; padding: 6px; }
.demo-meeting-modal-close:hover { color: var(--ink); }
.demo-form-meeting-heading { font-weight: 700; margin: 0 0 var(--space-md); text-align: center; }
.demo-meeting-modal .meetings-iframe-container { min-height: 560px; }

/* ---- Logo wall ---- */
.logo-wall {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: var(--space-lg);
}
.logo-wall a, .logo-wall span { flex: 0 0 120px; display: flex; align-items: center; justify-content: center; }
.logo-wall img { max-height: 32px; width: auto; margin: 0 auto; opacity: .6; filter: grayscale(1); transition: opacity .15s ease, filter .15s ease; }
.logo-wall a:hover img, .logo-wall img:hover { opacity: 1; filter: grayscale(0); }

/* ---- Logo rotator — compact, cycling variant for tight spaces
   (e.g. the Book a Demo sidebar card). See knit_render_logo_rotator(). ---- */
.logo-rotator { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-lg); }
.logo-rotator-slot { position: relative; width: 110px; height: 32px; }
.logo-rotator-slot a, .logo-rotator-slot span {
	position: absolute; inset: 0;
	display: flex; align-items: center; justify-content: center;
	opacity: 0; transition: opacity .5s ease;
	pointer-events: none;
}
.logo-rotator-slot a.is-active, .logo-rotator-slot span.is-active { opacity: 1; pointer-events: auto; }
.logo-rotator-slot img { max-height: 28px; width: auto; opacity: .6; filter: grayscale(1); }
.logo-rotator-slot a:hover img { opacity: 1; filter: grayscale(0); }

/* Subtle trust markers above the logo wall — real G2 rating + the
   Google for Startups Accelerator badge (chargebee.com pattern: a
   quiet one-line strip of proof points sitting between the section
   heading and the customer logos, not a standalone hero moment). */
.logo-wall-trust {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: 10px 20px;
	margin: 10px 0 var(--space-lg);
	font-size: 13px;
	font-weight: 600;
	color: var(--ink-soft);
}
.logo-wall-trust-item { display: inline-flex; align-items: center; gap: 7px; }
.logo-wall-trust-item img { height: 14px; width: auto; display: block; }
.logo-wall-trust-item .g2-stars-inline { height: 16px; }
.logo-wall-trust-sep { color: var(--border); }

/* ---- Logo marquee — 3-row auto-scrolling app catalogue. Reusable
   across any page that needs to show integration breadth (see
   knit_render_logo_marquee() in inc/template-tags.php). Each row's
   track holds the card set twice back-to-back; animating translateX
   from 0 to -50% loops seamlessly. ---- */
.logo-marquee {
	display: flex;
	flex-direction: column;
	gap: 14px;
	overflow: hidden;
	-webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
	mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}
.logo-marquee-row { overflow: hidden; }
.logo-marquee-track {
	display: flex;
	width: max-content;
	gap: 14px;
	animation: logo-marquee-scroll 46s linear infinite;
}
.logo-marquee-row--reverse .logo-marquee-track { animation-direction: reverse; }
.logo-marquee-row:hover .logo-marquee-track { animation-play-state: paused; }
@keyframes logo-marquee-scroll {
	from { transform: translateX(0); }
	to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
	.logo-marquee-track { animation: none; }
}
.logo-marquee-card {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	gap: 10px;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: 14px;
	padding: 10px 16px 10px 10px;
	white-space: nowrap;
}
.logo-marquee-icon {
	flex-shrink: 0;
	width: 38px;
	height: 38px;
	border-radius: 10px;
	background: var(--navy-100);
	display: flex;
	align-items: center;
	justify-content: center;
}
.logo-marquee-icon img { max-width: 22px; max-height: 22px; width: auto; height: auto; }
.logo-marquee-meta { display: flex; flex-direction: column; gap: 1px; }
.logo-marquee-name { font-family: var(--font-display); font-weight: 700; font-size: 14px; color: var(--ink); }
.logo-marquee-category { font-size: 12px; color: var(--ink-soft); }

/* ---- Trust bar ---- */
.trust-bar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--space-lg);
	padding: var(--space-md) 0;
}
.trust-bar img { max-height: 32px; width: auto; }

/* Large compliance-badge variant (SOC 2 / GDPR / ISO on the product and
   category pages) - full size on desktop, scaled down on mobile so three
   of them don't dominate a narrow screen. */
.trust-bar img.trust-badge-lg { height: 160px; width: 160px; max-height: 160px; max-width: 160px; }
@media (max-width: 640px) { .trust-bar img.trust-badge-lg { height: 90px; width: 90px; max-height: 90px; max-width: 90px; } }

/* ---- Testimonial grid ---- */
.testimonial-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 18px; }
/* min-height so every card matches the tallest real quote instead of
   each row sizing to its own shortest/tallest mix -- 340px comfortably
   fits the longest real quote among current testimonials (measured
   live at the grid's narrowest column width, 260px: 326px), with a
   small buffer for future content. blockquote's flex:1 (below) fills
   the remaining space so shorter quotes don't leave the attribution
   row floating at an inconsistent position. */
.testimonial-card { display: flex; flex-direction: column; min-height: 340px; background: var(--white); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 20px; box-shadow: var(--shadow-inset); }
.testimonial-card-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 14px; min-height: 24px; }
.testimonial-company-logo { max-height: 24px; max-width: 110px; width: auto; min-width: 0; flex-shrink: 1; }
.testimonial-case-study-tag {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	flex-shrink: 0;
	font-size: 11.5px;
	font-weight: 700;
	color: var(--accent-strong);
	background: var(--accent-soft);
	border-radius: var(--radius-pill);
	padding: 4px 10px;
	text-decoration: none;
	white-space: nowrap;
}
.testimonial-case-study-tag svg { width: 12px; height: 12px; }
.testimonial-case-study-tag:hover { background: var(--coral-100); }
.testimonial-card blockquote { flex: 1; margin: 0 0 14px; font-size: 15px; color: var(--ink); }
.testimonial-attribution { display: flex; align-items: center; gap: 10px; }
.testimonial-attribution img { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
/* Neutral now (was background:var(--accent-gradient); color:#fff) --
   the initials circle was rendering in the site's primary brand
   gradient, competing with the customer logo for attention. One-line
   revert: swap the two declarations below back. */
.testimonial-avatar-fallback {
	width: 36px;
	height: 36px;
	border-radius: 50%;
	background: var(--navy-100);
	color: var(--ink-soft);
	display: flex;
	align-items: center;
	justify-content: center;
	font-weight: 700;
	font-size: 14px;
	flex-shrink: 0;
}
.testimonial-attribution .name { font-weight: 700; font-size: 13.5px; }
.testimonial-attribution .role { font-size: 12.5px; color: var(--ink-soft); }

/* ---- CTA banner ---- */
.cta-banner {
	background: var(--navy-900);
	color: #fff;
	border-radius: 28px;
	padding: var(--space-xl) var(--space-xl);
	text-align: center;
}
.cta-banner h2 { color: #fff; }
.cta-banner p { color: #B9C4D6; margin-left: auto; margin-right: auto; }

/* ---- Product showcase (homepage) ---- */
.product-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 20px;
	align-items: stretch;
}
@media (max-width: 900px) { .product-grid { grid-template-columns: 1fr; } }
.product-block {
	position: relative;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	padding: 28px 26px;
	display: flex;
	flex-direction: column;
	text-align: left;
}
.product-block .card-icon { margin-bottom: 18px; }
.product-block h3 { font-size: 21px; margin-bottom: 6px; }
.product-block .product-audience { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; color: var(--ink-soft); margin-bottom: 4px; }
.product-block p.product-body { font-size: 14.5px; color: var(--ink-soft); margin-bottom: 16px; }
.product-block ul.product-bullets { list-style: none; margin: 0 0 22px; padding: 0; display: flex; flex-direction: column; gap: 8px; flex-grow: 1; }
.product-block ul.product-bullets li { font-size: 13.5px; color: var(--ink); display: flex; align-items: baseline; gap: 8px; }
.product-block ul.product-bullets li::before { content: "→"; color: var(--accent-strong); font-weight: 700; flex-shrink: 0; }
.product-block .btn { align-self: flex-start; }

.product-block--featured {
	border: 2px solid var(--accent);
	box-shadow: var(--shadow-lg);
	background: linear-gradient(180deg, var(--coral-100) 0%, var(--white) 22%);
}
.product-block--featured .card-icon { background: var(--accent); color: #fff; }
.product-new-badge {
	position: absolute;
	top: -12px;
	right: 22px;
	background: var(--amber-500);
	color: #4A2E00;
	font-size: 11.5px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .04em;
	padding: 4px 10px;
	border-radius: 100px;
	box-shadow: var(--shadow-sm);
}

/* ---- Hero path picker: self-select instead of a generic hero CTA ---- */
.hero-paths {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 18px;
	text-align: left;
	margin-top: var(--space-xl);
}
@media (max-width: 900px) { .hero-paths { grid-template-columns: 1fr; } }

.hero-path-card {
	position: relative;
	min-width: 0;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	padding: 22px;
	box-shadow: var(--shadow-inset);
	display: flex;
	flex-direction: column;
}
.hero-path-card--featured {
	border: 2px solid var(--accent);
	box-shadow: var(--shadow-lg);
	background: linear-gradient(180deg, var(--coral-100) 0%, var(--white) 26%);
}
.hero-path-card .card-icon { margin-bottom: 14px; }
.hero-path-card h3 { font-size: 19px; margin-bottom: 6px; }
.hero-path-audience { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--ink-soft); margin-bottom: 4px; }
.hero-path-card p { font-size: 14px; color: var(--ink-soft); margin-bottom: 16px; }
.hero-path-link { margin-top: auto; display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 700; color: var(--accent-strong); text-decoration: none; }
.hero-path-link svg { width: 15px; height: 15px; }
.hero-path-link:hover { text-decoration: underline; }

/* Lovable/Replit-style prompt teaser inside the Agent card */
.hero-prompt-box {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	background: var(--navy-100);
	border: 1px solid var(--border);
	border-radius: 14px;
	padding: 10px 10px 10px 14px;
	margin-bottom: 12px;
}
.hero-prompt-text {
	min-width: 0;
	flex: 1 1 auto;
	font-size: 12.5px;
	color: var(--ink-soft);
	transition: opacity .25s ease;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.hero-prompt-submit {
	flex-shrink: 0;
	width: 26px; height: 26px;
	border-radius: 50%;
	background: var(--accent-gradient);
	color: #fff;
	display: flex; align-items: center; justify-content: center;
}
.hero-prompt-submit svg { width: 13px; height: 13px; }
.hero-prompt-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 16px; }
.hero-prompt-chip {
	font-size: 11.5px;
	font-weight: 600;
	color: var(--ink-soft);
	background: var(--navy-100);
	border: 1px solid var(--border);
	border-radius: var(--radius-pill);
	padding: 4px 10px;
}

/* Full-size prompt composer — the working version of the hero-prompt-box
   teaser above, for product pages where visitors actually type/submit a
   prompt (vs. the homepage card, which is decorative only). */
.prompt-composer {
	text-align: left;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-lg);
	padding: 18px;
}
.prompt-composer-input {
	display: block;
	width: 100%;
	border: none;
	background: transparent;
	resize: none;
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.5;
	color: var(--ink);
	min-height: 64px;
}
.prompt-composer-input::placeholder { color: var(--ink-soft); }
.prompt-composer-input:focus { outline: none; }
.prompt-composer-actions {
	display: flex;
	justify-content: flex-end;
	margin-top: 10px;
}
.prompt-composer-examples {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 8px;
	margin-top: 14px;
}
.prompt-composer-examples-label { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); }
.prompt-composer-chip {
	font-family: var(--font-body);
	font-size: 12.5px;
	font-weight: 600;
	color: var(--ink-soft);
	background: var(--navy-100);
	border: 1px solid var(--border);
	border-radius: var(--radius-pill);
	padding: 6px 14px;
	cursor: pointer;
	transition: border-color .12s ease, color .12s ease;
}
.prompt-composer-chip:hover { border-color: var(--accent); color: var(--ink); }

/* ---- Product demo video tabs ---- */
.video-tabs { margin-top: var(--space-lg); }
.video-tabs-nav {
	display: flex;
	gap: 10px;
	justify-content: center;
	flex-wrap: wrap;
	margin-bottom: var(--space-lg);
}
.video-tab {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 18px 8px 8px;
	border-radius: var(--radius-pill);
	border: 1px solid var(--border);
	background: var(--white);
	font-family: inherit;
	font-weight: 700;
	font-size: 14px;
	color: var(--ink-soft);
	cursor: pointer;
	transition: border-color .15s ease, color .15s ease, box-shadow .15s ease;
}
.video-tab .card-icon { width: 30px; height: 30px; border-radius: 9px; margin-bottom: 0; }
.video-tab:hover { border-color: var(--accent); color: var(--ink); }
.video-tab.is-active { border-color: var(--accent); color: var(--ink); box-shadow: var(--shadow-sm); }

.video-tab-panel { display: none; }
.video-tab-panel.is-active { display: block; }

/* Simple horizontal underline tabs — instant click-to-switch, no
   scroll/observer involved (unlike .product-showcase's scrollspy).
   Kept as its own component rather than reusing .video-tab's pill
   style, since this is a plain text-label tab strip. */
.tab-strip-nav {
	display: flex;
	gap: 32px;
	flex-wrap: wrap;
	border-bottom: 1px solid var(--border);
	margin-bottom: var(--space-lg);
}
.tab-strip-item {
	background: none;
	border: none;
	border-bottom: 2px solid transparent;
	margin-bottom: -1px;
	padding: 0 0 14px;
	font-family: inherit;
	font-weight: 700;
	font-size: 15px;
	color: var(--ink-soft);
	cursor: pointer;
	transition: color .15s ease, border-color .15s ease;
}
.tab-strip-item:hover { color: var(--ink); }
.tab-strip-item.is-active { color: var(--ink); border-bottom-color: var(--accent-strong); }
@media (max-width: 480px) {
	.tab-strip-nav { flex-wrap: nowrap; overflow-x: auto; justify-content: flex-start !important; -webkit-overflow-scrolling: touch; gap: 22px; }
	.tab-strip-item { white-space: nowrap; flex-shrink: 0; }
}
.tab-strip-panel { display: none; }
.tab-strip-panel.is-active { display: block; }

.video-embed {
	position: relative;
	width: 100%;
	max-width: 860px;
	margin: 0 auto;
	aspect-ratio: 16 / 9;
	border-radius: var(--radius-card);
	overflow: hidden;
	box-shadow: var(--shadow-lg);
	background: var(--navy-900);
}
.video-embed iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.video-facade {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	padding: 0;
	border: 0;
	cursor: pointer;
	background-size: cover;
	background-position: center;
	display: flex;
	align-items: center;
	justify-content: center;
}
.video-facade::after {
	content: "";
	position: absolute;
	inset: 0;
	background: rgba(0, 17, 43, .28);
	transition: background .15s ease;
}
.video-facade:hover::after { background: rgba(0, 17, 43, .45); }
.video-play-btn {
	position: relative;
	z-index: 1;
	width: 68px;
	height: 68px;
	border-radius: 50%;
	background: var(--accent-gradient);
	color: #fff;
	display: flex;
	align-items: center;
	justify-content: center;
	box-shadow: var(--shadow-lg);
}
.video-play-btn svg { width: 26px; height: 26px; margin-left: 3px; }

/* ---- Product showcase: horizontal scrollspy nav + sequential product
   panels ---- Originally a sticky *vertical* sidebar next to all 3
   panels stacked beside it; briefly a click-to-switch horizontal tab
   strip (2026-08-30); now horizontal AND still a scrollspy -- nav stays
   sticky just under the site header while you scroll past the 3
   stacked panels below it, auto-highlighting whichever one is in view,
   same as the original interaction, just turned 90 degrees. Panel
   content still gets the full container width either way, since the
   nav is a row above the panels now, not a column beside them (see
   .product-showcase-panel-inner below). */
.product-showcase {
	margin-top: var(--space-xl);
}

.product-showcase-nav {
	position: sticky;
	top: 88px;
	z-index: 10;
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	justify-content: center;
	gap: 10px;
	margin-bottom: var(--space-lg);
	background: var(--white);
	padding: 8px 0;
}
.product-showcase-nav-item {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 16px 8px 8px;
	border-radius: 12px;
	border: 1px solid transparent;
	background: none;
	font-family: inherit;
	font-weight: 700;
	font-size: 14px;
	color: var(--ink-soft);
	text-align: left;
	cursor: pointer;
	transition: background .15s ease, color .15s ease;
}
.product-showcase-nav-item .card-icon { width: 30px; height: 30px; border-radius: 9px; margin-bottom: 0; }
.product-showcase-nav-item:hover { background: var(--navy-100); color: var(--ink); }
.product-showcase-nav-item.is-active { background: var(--navy-100); color: var(--ink); border-color: var(--border); }

.product-showcase-panels { display: flex; flex-direction: column; gap: 64px; }
.product-showcase-panel {
	opacity: 0;
	transform: translateY(16px);
	transition: opacity .5s ease, transform .5s ease;
	/* Clears both the sticky site header and the sticky nav row above
	   so scrollIntoView (or a direct #hash link) doesn't land with the
	   panel's heading hidden underneath either of them. */
	scroll-margin-top: 160px;
}
.product-showcase-panel.is-visible { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
	.product-showcase-panel { opacity: 1; transform: none; transition: none; }
}

.product-showcase-panel-inner {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 36px;
	align-items: center;
}
/* Grid items default to min-width:auto, so a child with wide intrinsic
   content (e.g. an unwrapped <pre> inside .code-sample) refuses to
   shrink below that width and blows the column out past the viewport
   on narrow screens, even though .code-sample itself has its own
   overflow-x:auto. min-width:0 lets the track actually shrink. */
.product-showcase-panel-inner > * { min-width: 0; }
@media (max-width: 700px) { .product-showcase-panel-inner { grid-template-columns: 1fr; } }
.product-showcase-panel h3 { font-size: 26px; margin: 8px 0 10px; }
.product-showcase-panel > .product-showcase-panel-inner > div:first-child > p { color: var(--ink-soft); margin-bottom: 20px; }

.product-showcase-features { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-direction: column; gap: 16px; }
.product-showcase-features li { display: flex; align-items: flex-start; gap: 12px; }
.product-showcase-features .card-icon { width: 34px; height: 34px; border-radius: 10px; margin-bottom: 0; flex-shrink: 0; }
.product-showcase-features h4 { font-size: 14.5px; margin: 0 0 2px; }
.product-showcase-features p { font-size: 13.5px; color: var(--ink-soft); margin: 0; }

.product-showcase-media {
	position: relative;
	border-radius: var(--radius-card);
	border: 1px solid var(--border);
	box-shadow: var(--shadow-lg);
	aspect-ratio: 4 / 3;
	overflow: hidden;
}
.product-showcase-media--coral { background: linear-gradient(160deg, var(--coral-100), var(--white) 70%); }
.product-showcase-media--teal { background: linear-gradient(160deg, var(--teal-100), var(--white) 70%); }
.product-showcase-media--amber { background: linear-gradient(160deg, var(--amber-100), var(--white) 70%); }

/* ---- Product showcase — real product screenshots ----
   `contain`, not `cover`: these are compact card-style graphics with
   transparent backgrounds meant to float centered on the panel's
   gradient (coral/teal/amber), not full-bleed screenshots -- `cover`
   would crop their content to fill the 4/3 frame. */
.showcase-graphic { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 24px; }
.showcase-graphic img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; display: block; }

/* ---- Product showcase — legacy placeholder (icon + skeleton lines),
   still used by a couple of panels on product pages that haven't
   been given a real screenshot/graphic yet ---- */
.product-showcase-media--legacy { padding: 22px; display: flex; flex-direction: column; gap: 18px; }
.product-showcase-media-chrome { display: flex; gap: 6px; }
.product-showcase-media-chrome span { width: 9px; height: 9px; border-radius: 50%; background: rgba(0,17,43,.15); }
.product-showcase-media-icon {
	flex: 1;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 72px;
	height: 72px;
	margin: 0 auto;
	border-radius: 20px;
	background: var(--white);
	box-shadow: var(--shadow-sm);
	color: var(--accent-strong);
}
.product-showcase-media-icon svg { width: 32px; height: 32px; }
.product-showcase-media-lines { display: flex; flex-direction: column; gap: 8px; }
.product-showcase-media-lines span { display: block; height: 8px; border-radius: 4px; background: rgba(0,17,43,.1); }

/* ---- "Bring your own docs" panel — mock paste-a-URL / upload-a-file UI ---- */
.docs-mock { position: absolute; inset: 0; display: flex; flex-direction: column; background: linear-gradient(160deg, var(--coral-100), var(--white) 70%); }
.docs-mock-chrome { display: flex; gap: 6px; padding: 16px 16px 0; }
.docs-mock-chrome span { width: 9px; height: 9px; border-radius: 50%; background: rgba(0,17,43,.15); }
.docs-mock-body { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: 16px; padding: 20px 30px; }
.docs-mock-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-soft); margin: 0; }
.docs-mock-url-row { display: flex; align-items: center; gap: 10px; background: var(--white); border: 1px solid var(--border); border-radius: 12px; padding: 10px 10px 10px 14px; box-shadow: var(--shadow-sm); }
.docs-mock-url-row svg { width: 17px; height: 17px; color: var(--coral-600); flex-shrink: 0; }
.docs-mock-url-text { flex: 1; font-family: var(--font-mono); font-size: 12.5px; color: var(--ink-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.docs-mock-submit { width: 28px; height: 28px; border-radius: 50%; background: var(--accent-gradient); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.docs-mock-submit svg { width: 13px; height: 13px; color: #fff; }
.docs-mock-divider { text-align: center; font-size: 12px; color: var(--ink-soft); position: relative; margin: 2px 0; }
.docs-mock-divider span { background: var(--white); padding: 0 10px; position: relative; z-index: 1; }
.docs-mock-divider::before { content: ""; position: absolute; top: 50%; left: 0; right: 0; height: 1px; background: var(--border); }
.docs-mock-files { display: flex; gap: 16px; justify-content: center; }
.docs-mock-file { display: flex; flex-direction: column; align-items: center; gap: 6px; font-size: 11px; color: var(--ink-soft); font-weight: 600; }
.docs-mock-file svg { width: 36px; height: 36px; filter: drop-shadow(0 2px 4px rgba(0,17,43,.12)); }

/* ---- "Beyond SaaS apps" panel — a destination picker mockup (a
   realistic select control, open, listing a mix of SaaS apps and
   infra destinations) rather than a diagram — conveys "pick from
   many destinations" without a busy multi-node illustration. Plain
   HTML/CSS (not SVG) so equal padding on every side is guaranteed by
   the box model instead of hand-computed coordinates: the chrome
   dots are absolutely positioned (don't consume flex space) and the
   body fills the card with a single, symmetric padding value. ---- */
.dest-mock { position: absolute; inset: 0; background: linear-gradient(160deg, var(--coral-100), var(--white) 70%); }
.dest-mock-chrome { position: absolute; top: 16px; left: 16px; display: flex; gap: 6px; z-index: 1; }
.dest-mock-chrome span { width: 9px; height: 9px; border-radius: 50%; background: rgba(0,17,43,.12); }
.dest-mock-body { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; gap: 10px; padding: 42px 34px; }
.dest-mock-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--ink-soft); margin: 0; }
.dest-mock-select { display: flex; align-items: center; justify-content: space-between; background: var(--white); border: 1px solid var(--border); border-radius: 10px; padding: 9px 12px; box-shadow: var(--shadow-sm); }
.dest-mock-select-value { font-size: 13px; font-weight: 700; color: var(--ink); }
.dest-mock-select svg { width: 13px; height: 13px; color: var(--ink-soft); flex-shrink: 0; }
.dest-mock-list { background: var(--white); border: 1px solid var(--border); border-radius: 10px; box-shadow: var(--shadow-md); overflow: hidden; }
.dest-mock-option { display: flex; align-items: center; gap: 9px; padding: 7px 12px; font-size: 12px; font-weight: 600; color: var(--ink); border-bottom: 1px solid var(--navy-100); }
.dest-mock-option:last-child { border-bottom: none; }
.dest-mock-option img, .dest-mock-option .dest-mock-icon { width: 17px; height: 17px; flex-shrink: 0; border-radius: 4px; }
.dest-mock-option .dest-mock-icon { display: flex; align-items: center; justify-content: center; background: var(--coral-600); color: #fff; }
.dest-mock-option .dest-mock-icon svg { width: 11px; height: 11px; }
.dest-mock-option.is-selected { background: var(--coral-100); }
.dest-mock-option-check { margin-left: auto; width: 13px; height: 13px; color: var(--coral-600); flex-shrink: 0; }
.dest-mock-more { font-size: 11px; color: var(--ink-soft); text-align: center; margin: 2px 0 0; }

/* ---- "Finds new connectors itself" panel — a 3-step auto-discovery
   checklist (search -> build -> ready), all steps shown complete.
   Same light-card family and equal-padding technique as the other
   three panel mockups. ---- */
.connectors-mock { position: absolute; inset: 0; background: linear-gradient(160deg, var(--coral-100), var(--white) 70%); }
.connectors-mock-chrome { position: absolute; top: 16px; left: 16px; display: flex; gap: 6px; z-index: 1; }
.connectors-mock-chrome span { width: 9px; height: 9px; border-radius: 50%; background: rgba(0,17,43,.12); }
.connectors-mock-body { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; gap: 10px; padding: 42px 34px; }
.connectors-mock-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--ink-soft); margin: 0; }
.connectors-mock-list { background: var(--white); border: 1px solid var(--border); border-radius: 10px; box-shadow: var(--shadow-md); overflow: hidden; }
.connectors-mock-row { display: flex; align-items: center; gap: 11px; padding: 13px 14px; border-bottom: 1px solid var(--navy-100); }
.connectors-mock-row:last-child { border-bottom: none; }
.connectors-mock-icon { width: 26px; height: 26px; border-radius: 7px; background: var(--coral-600); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.connectors-mock-icon svg { width: 15px; height: 15px; color: #fff; }
.connectors-mock-row-label { font-size: 13px; font-weight: 700; color: var(--ink); flex: 1; }
.connectors-mock-check { width: 16px; height: 16px; color: var(--coral-600); flex-shrink: 0; }
.connectors-mock-footer { font-size: 11px; color: var(--ink-soft); text-align: center; margin: 2px 0 0; }

/* ---- "Native LLM connectors" panel — one workflow step, with a
   model row of provider logos, framed as a step inside a longer
   pipeline (dashed connector in/out). Static; same absolute-fill
   technique as .flow-mock so the SVG always centers with equal
   padding regardless of the chrome-dot bar. ---- */
.llm-mock { position: absolute; inset: 0; background: linear-gradient(160deg, var(--coral-100), var(--white) 70%); }
.llm-mock-chrome { position: absolute; top: 16px; left: 16px; display: flex; gap: 6px; z-index: 1; }
.llm-mock-chrome span { width: 9px; height: 9px; border-radius: 50%; background: rgba(0,17,43,.12); }
.llm-mock-diagram { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
.llm-mock-diagram text { font-family: var(--font-body); }
.llm-mock-card-bg { fill: var(--white); filter: drop-shadow(0 8px 20px rgba(11,21,38,.1)); }
.llm-mock-icon-badge { fill: var(--coral-600); }
.llm-mock-title { font-size: 14px; font-weight: 700; fill: var(--ink); }
.llm-mock-subtitle { font-size: 11px; fill: var(--ink-soft); }
.llm-mock-divider { stroke: var(--border); stroke-width: 1; }
.llm-mock-model-label { font-size: 9.5px; font-weight: 700; letter-spacing: .05em; fill: var(--ink-soft); text-transform: uppercase; }
.llm-mock-logo-ring { fill: none; stroke: var(--coral-500); stroke-width: 2; }
.llm-mock-connector { fill: none; stroke: var(--coral-500); stroke-opacity: .4; stroke-width: 1.25; stroke-dasharray: 1 4; stroke-linecap: round; }
.llm-mock-dot { fill: var(--coral-500); }

/* ---- G2 rating + award badges ---- */
.g2-stars { margin: var(--space-md) auto 8px; height: 28px; width: auto; }
.g2-badge-row {
	display: flex;
	justify-content: center;
	align-items: flex-end;
	flex-wrap: wrap;
	gap: 28px;
	margin-top: var(--space-lg);
}
.g2-badge-row img {
	width: 150px;
	height: auto;
	filter: drop-shadow(0 6px 14px rgba(0, 17, 43, .1));
	transition: transform .15s ease;
}
.g2-badge-row img:hover { transform: translateY(-3px); }
@media (max-width: 640px) { .g2-badge-row img { width: 120px; } }

/* ---- Spotlight band (dark, single-product deep dive) ---- */
.spotlight {
	background: var(--navy-900);
	color: #E7ECF3;
	border-radius: 28px;
	padding: 56px 48px;
}
.spotlight .eyebrow { background: rgba(131, 137, 146, .16); color: var(--coral-500); }
.spotlight h2 { color: #fff; max-width: 20ch; }
.spotlight > .container, .spotlight-body { max-width: 640px; }
.spotlight-body p { color: #AEBBCC; }

.compare-mini { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 28px 0; }
@media (max-width: 640px) { .compare-mini { grid-template-columns: 1fr; } }
.compare-mini-col { background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.1); border-radius: 18px; padding: 20px; }
.compare-mini-col h4 { font-size: 13px; text-transform: uppercase; letter-spacing: .04em; margin: 0 0 14px; color: #8B9AB0; }
.compare-mini-col.is-knit h4 { color: var(--coral-500); }
.compare-mini-col ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.compare-mini-col li { display: flex; align-items: flex-start; gap: 8px; font-size: 14px; line-height: 1.4; }
.compare-mini-col .knit-icon { flex-shrink: 0; margin-top: 2px; }
.compare-mini-col:not(.is-knit) .knit-icon { color: #6B7A90; }
.compare-mini-col.is-knit .knit-icon { color: var(--coral-500); }

/* ---- Hero backdrop ---- */
.hero-backdrop { position: relative; overflow: hidden; }
.hero-backdrop::before {
	content: "";
	position: absolute;
	inset: -15% -10% auto -10%;
	height: 620px;
	background:
		radial-gradient(480px circle at 20% 15%, var(--coral-100) 0%, transparent 62%),
		radial-gradient(420px circle at 88% 10%, var(--amber-100) 0%, transparent 55%),
		radial-gradient(560px circle at 50% -5%, var(--teal-100) 0%, transparent 68%);
	opacity: .85;
	z-index: 0;
	pointer-events: none;
}
.hero-backdrop > .container { position: relative; z-index: 1; }

.hero-graphic-wrap {
	position: relative;
	z-index: 1;
	margin: var(--space-xl) auto 0;
	max-width: 860px;
	padding: 24px 20px 18px;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-lg), var(--shadow-inset);
}
.hero-graphic { display: block; width: 100%; height: auto; }
@media (prefers-reduced-motion: reduce) {
	.hero-graphic .flow-dot { display: none; }
}
@media (max-width: 640px) { .hero-graphic-wrap { padding: 18px 12px 14px; } }

/* ---- Logo cluster: centered text+CTA "encircled" by scattered real app
   logo tiles, decorative constellation around a content card. On mobile
   the absolutely-positioned tiles collapse into a plain centered row
   below the content instead of overlapping. ---- */
.logo-cluster {
	position: relative;
	max-width: 900px;
	min-height: 460px;
	margin: var(--space-xl) auto 0;
	display: flex;
	align-items: center;
	justify-content: center;
}
.logo-cluster-content { position: relative; z-index: 1; max-width: 46ch; text-align: center; }
.logo-cluster-logo {
	position: absolute;
	width: 56px;
	height: 56px;
	border-radius: 14px;
	background: var(--white);
	border: 1px solid var(--border);
	box-shadow: var(--shadow-sm);
	display: flex;
	align-items: center;
	justify-content: center;
}
.logo-cluster-logo img { width: 30px; height: 30px; object-fit: contain; }
@media (max-width: 768px) {
	.logo-cluster { flex-direction: column; gap: 24px; min-height: 0; padding: 0 4px; }
	.logo-cluster-logo { position: static; }
	.logo-cluster-logos { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; }
}
@media (min-width: 769px) { .logo-cluster-logos { display: contents; } }

/* ---- Card logo row: small overlapping stack of real app-logo tiles at
   the top of a card (e.g. "which apps power this use case"). Same tile
   language as .logo-cluster-logo (white, bordered, shadow-sm) but a
   static inline row instead of an absolutely-scattered constellation. */
.card-logo-row { display: flex; margin-bottom: 14px; }
.card-logo-tile {
	width: 40px;
	height: 40px;
	border-radius: var(--radius);
	background: var(--white);
	border: 1px solid var(--border);
	box-shadow: var(--shadow-sm);
	display: flex;
	align-items: center;
	justify-content: center;
	margin-right: -10px;
}
.card-logo-tile:last-child { margin-right: 0; }
.card-logo-tile img { width: 22px; height: 22px; object-fit: contain; }
/* Solutions archive cards put the logo row inline next to the category
   badge (not stacked above the title like the category-page use-case
   cards), so the row's own bottom margin would throw off vertical
   centering in that flex header. */
.app-directory-card .card-logo-row { margin-bottom: 0; }
.app-directory-card .card-logo-tile { width: 28px; height: 28px; margin-right: -8px; }
.app-directory-card .card-logo-tile img { width: 16px; height: 16px; }

/* ---- Solution page feature rows: real per-feature icon (sourced from
   the Webflow CMS export, not the site's stroke-icon set) beside a
   title/description pair. ---- */
.solution-feature { display: flex; gap: 14px; align-items: flex-start; margin-bottom: 22px; }
.solution-feature-icon { width: 40px; height: 40px; object-fit: contain; flex-shrink: 0; margin-top: 2px; }
.solution-feature h3 { margin: 0 0 4px; font-size: 17px; }
.solution-feature p { margin: 0; }

/* ---- App directory: shared searchable/filterable catalog grid, used by
   the Integrations, MCP Servers, and LLM Tools archives (one template,
   template-parts/app-directory-archive.php). Sidebar category list +
   flat card grid, filtered client-side by nav.js. ---- */
.app-directory-search {
	display: block;
	width: 100%;
	padding: 16px 20px;
	font-size: 16px;
	font-family: inherit;
	color: var(--ink);
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-sm);
}
.app-directory-search:focus { outline: none; border-color: var(--teal-400); }
.app-directory {
	display: grid;
	grid-template-columns: 240px 1fr;
	gap: 32px;
	align-items: start;
	margin-top: var(--space-lg);
}
.app-directory-sidebar { position: sticky; top: 96px; }
.app-directory-sidebar h3 { font-size: 15px; margin: 0 0 12px; }
.app-directory-cats { list-style: none; margin: 0 0 16px; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.app-directory-cat {
	display: block;
	width: 100%;
	text-align: left;
	background: none;
	border: none;
	font-family: inherit;
	padding: 8px 12px;
	border-radius: 8px;
	font-size: 14px;
	color: var(--ink-soft);
	cursor: pointer;
	text-decoration: none;
}
.app-directory-cat:hover { background: var(--navy-100); }
.app-directory-cat.is-active { background: var(--accent-soft); color: var(--accent-strong); font-weight: 700; }
.app-directory-sidebar-note { font-size: 13px; color: var(--ink-soft); border-top: 1px solid var(--border); padding-top: 16px; }
.app-directory-sidebar-note-text { display: flex; align-items: flex-start; gap: 8px; margin: 0; }
.app-directory-sidebar-note-text svg { flex-shrink: 0; width: 18px; height: 18px; margin-top: 1px; color: var(--accent-strong); }
.app-directory-sidebar-note a { display: block; width: 100%; text-align: center; margin-top: 12px; }
.app-directory-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(112px, 1fr)); gap: 16px; }
.app-directory-card {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 10px;
	min-height: 118px;
	padding: 16px 10px;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	text-decoration: none;
	color: inherit;
	text-align: center;
	box-shadow: var(--shadow-sm);
}
.app-directory-card:hover { border-color: var(--teal-400); transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.app-directory-icon { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; }
.app-directory-icon img { width: 100%; height: 100%; object-fit: contain; }
.app-directory-name { font-size: 13px; font-weight: 600; line-height: 1.3; }
.app-directory-card.is-hidden { display: none; }
.app-directory-card--cta { position: relative; background: var(--accent-gradient); border-color: transparent; color: #fff; }
.app-directory-card--cta:hover { border-color: transparent; color: #fff; }
.app-directory-card--cta .product-new-badge { right: 10px; }
.app-directory-card--cta .app-directory-icon { color: #fff; }
.app-directory-empty { grid-column: 1 / -1; text-align: center; color: var(--ink-soft); padding: 40px 0; display: none; }
.app-directory-sentinel { height: 1px; }
@media (max-width: 900px) {
	.app-directory { grid-template-columns: 1fr; }
	.app-directory-sidebar { position: static; }
	.app-directory-cats { flex-direction: row; flex-wrap: wrap; gap: 8px; }
	.app-directory-cat { width: auto; border: 1px solid var(--border); }
	.app-directory-sidebar-note { border-top: none; padding-top: 0; }
}

/* ---- Section background rhythm ---- */
.section--tint { background: var(--white); }
.section--sunk { background: var(--navy-100); }

/* ---- Migrated post/page body content ---- */
.entry-content, .prose {
	overflow-wrap: break-word;
}
.entry-content pre {
	background: var(--navy-900);
	color: #DCEFEA;
	padding: 16px 18px;
	border-radius: 16px;
	overflow-x: auto;
	max-width: 100%;
	font-family: var(--font-mono);
	font-size: 13px;
	line-height: 1.55;
}
.entry-content code, .prose code {
	font-family: var(--font-mono);
	font-size: 0.9em;
	background: var(--navy-100);
	padding: 2px 6px;
	border-radius: 4px;
}
.entry-content pre code {
	background: none;
	padding: 0;
	border-radius: 0;
	white-space: pre;
}
.entry-content table {
	max-width: 100%;
	overflow-x: auto;
	border-collapse: collapse;
	border: none;
	margin-bottom: var(--space-lg);
}
.entry-content th, .entry-content td {
	border: 1px solid var(--border);
	padding: 10px 14px;
	text-align: left;
	font-size: 14px;
}
.entry-content th {
	background: var(--navy-100);
	font-weight: 700;
}
/**
 * Migrated case-study tables sit inside a `data-rt-embed-type` wrapper
 * div (a Webflow rich-text embed artifact), so it's the div — not the
 * table — that needs the bottom margin; whatever follows (a pull-quote
 * paragraph, a heading, a list — checked across all 6 case studies
 * with tables) otherwise runs straight into the last table row with no
 * gap at all.
 */
.entry-content div[data-rt-embed-type] {
	margin-bottom: var(--space-lg);
}
/**
 * Real pull-quote paragraphs in the migrated copy are marked with this
 * class directly (see fix-case-study-content.php) rather than targeted
 * by position — the quote doesn't always sit right after the table
 * (Multiplier's follows a bullet list instead), so a sibling selector
 * missed it.
 */
.entry-content .cs-pullquote {
	margin-top: var(--space-lg);
	padding: var(--space-md) var(--space-lg);
	border-left: 4px solid var(--accent-strong);
	background: var(--navy-100);
	border-radius: var(--radius-card);
	font-size: 17px;
	font-style: italic;
}
.entry-content img {
	border-radius: var(--radius-card);
}
.entry-content iframe, .entry-content video {
	max-width: 100%;
}

/* ---- Breadcrumb ---- */
.breadcrumb { font-family: var(--font-mono); font-size: 12px; color: var(--ink-soft); margin-bottom: var(--space-md); }
.breadcrumb a { color: var(--ink-soft); text-decoration: none; }
.breadcrumb a:hover { color: var(--accent-strong); }

/* ---- Static page header (About, How Knit Works, legal docs, etc.) ---- */
.page-header { text-align: center; padding-bottom: var(--space-md); }
.page-header h1 { max-width: 34ch; margin-left: auto; margin-right: auto; }
.page-header p { max-width: 62ch; margin-left: auto; margin-right: auto; font-size: 17px; }
.page-updated { font-family: var(--font-mono); font-size: 12.5px; color: var(--ink-soft); }

/* ---- Long-form prose (legal documents) ---- */
.prose { max-width: 780px; margin: 0 auto; }
.prose h2 { font-size: 22px; margin-top: var(--space-xl); }
.prose h2:first-child { margin-top: 0; }
.prose h3 { font-size: 17px; margin-top: var(--space-lg); }
.prose p, .prose li { color: var(--ink-soft); font-size: 15px; line-height: 1.7; }
.prose ul, .prose ol { padding-left: 1.3em; margin: 0 0 var(--space-md); }
.prose li { margin-bottom: 6px; }
.prose strong { color: var(--ink); }
.prose a { color: var(--accent-strong); }

/* ---- Numbered step list (How Knit Works, Integrations Agent) ---- */
.step-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 20px; margin: var(--space-lg) 0; }
.step-list-item { background: var(--white); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 22px 20px; box-shadow: var(--shadow-inset); }
.step-list-item .step-number { font-family: var(--font-mono); font-size: 13px; font-weight: 700; color: var(--accent-strong); display: block; margin-bottom: 10px; }
.step-list-item h3 { margin-bottom: 6px; font-size: 16px; }
.step-list-item p { font-size: 14px; color: var(--ink-soft); margin: 0; }

/* ---- Value / principle cards (About page) ---- */
.value-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 18px; margin-top: var(--space-lg); }
.value-card h3 { font-size: 16px; margin-bottom: 6px; }
.value-card p { font-size: 14px; color: var(--ink-soft); margin: 0; }

/* ---- FAQ accordion (plain, CSS-only via <details>) ---- */
.faq-filter-wrap .tab-strip-nav { justify-content: center; }
.faq-list { max-width: 780px; margin: var(--space-lg) auto 0; display: flex; flex-direction: column; gap: 10px; }
.faq-item { background: var(--white); border: 1px solid var(--border); border-radius: 16px; padding: 4px 20px; }
.faq-item summary { cursor: pointer; padding: 16px 0; font-weight: 600; font-size: 15px; color: var(--ink); list-style: none; }
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after { content: "+"; float: right; color: var(--accent-strong); font-weight: 700; }
.faq-item[open] summary::after { content: "\2212"; }
.faq-item p { padding-bottom: 16px; margin: 0; color: var(--ink-soft); font-size: 14.5px; }
.faq-item.is-hidden { display: none; }

/* ---- Workflow hub "Browse by Function" (/integration-workflows/) ----
   Same shape and interaction model as the app directory sidebar
   (.app-directory-sidebar/.app-directory-cat, /integrations/): a real
   left sidebar of category links next to a filterable card grid.
   Horizontal Function tabs reuse .tab-strip-nav/.tab-strip-item; only
   the active function's .wf-subcat-panel is shown in the sidebar, and
   only the active sub-category's cards are shown in the grid -- both
   toggled by nav.js. Every tab/link is real (see archive-workflow.php);
   with JS off they just navigate to the real archive page instead. */
.wf-nested-hint { color: var(--ink-soft); font-size: 14px; margin: -8px auto var(--space-lg); }
.wf-fn-tabs { margin-bottom: 0; }
.wf-browse-body { display: grid; grid-template-columns: 1fr; gap: 32px; align-items: start; }
.wf-browse-body.has-sidebar { grid-template-columns: 220px 1fr; }
.wf-subcat-col { display: none; }
.wf-browse-body.has-sidebar .wf-subcat-col { display: block; }
/* Sub-category list mirrors .app-directory-cats/.app-directory-cat
   exactly -- left-aligned, borderless, full-width list items with a
   soft hover/active background, not centered pills. */
.wf-subcat-panel { display: none; list-style: none; margin: 0; padding: 0; flex-direction: column; gap: 2px; }
.wf-subcat-panel.is-active { display: flex; }
.wf-subcat-tab {
	display: block;
	width: 100%;
	padding: 8px 12px;
	border-radius: 8px;
	color: var(--ink-soft);
	font-weight: 600;
	font-size: 14px;
	text-decoration: none;
	transition: color .15s ease, background .15s ease;
}
.wf-subcat-tab:hover { background: var(--navy-100); }
.wf-subcat-tab.is-active { background: var(--accent-soft); color: var(--accent-strong); }
.wf-subcat-tab--all { font-weight: 700; }
.wf-filter-item.is-hidden { display: none; }
@media (max-width: 900px) {
	.wf-browse-body.has-sidebar { grid-template-columns: 1fr; }
	.wf-subcat-panel { flex-direction: row; flex-wrap: wrap; gap: 8px; }
	.wf-subcat-tab { width: auto; border: 1px solid var(--border); }
}

/* ---- Workflow step illustration (programmatic, no screenshot needed) ----
   Two stylized "app window" cards overlapping diagonally with a sync
   badge between them — same visual idea as a real product screenshot
   (browser-chrome dots, app header, data rows) but built entirely from
   markup + data, so a future workflow page can get one from just an
   app name + a few sample rows, no designer/export step required. */
.wf-mock { position: relative; min-height: 300px; padding: 20px 0; }
.wf-mock::before {
	content: "";
	position: absolute; inset: 10% 10%;
	background: radial-gradient(circle, var(--accent-soft) 0%, transparent 70%);
	opacity: .7; z-index: 0;
}
.wf-mock-card {
	position: relative; z-index: 1;
	background: #fff; border: 1px solid var(--border);
	border-radius: var(--radius-card); box-shadow: var(--shadow-lg);
	width: 78%; max-width: 300px; padding: 14px 16px;
}
.wf-mock-card--left { margin-right: auto; }
.wf-mock-card--right { margin-left: auto; margin-top: -48px; }
.wf-mock-dots { display: flex; gap: 5px; margin-bottom: 10px; }
.wf-mock-dots span { width: 8px; height: 8px; border-radius: 50%; display: block; }
.wf-mock-dots span:nth-child(1) { background: var(--coral-500); }
.wf-mock-dots span:nth-child(2) { background: var(--orange-500); }
.wf-mock-dots span:nth-child(3) { background: var(--teal-500); }
.wf-mock-app { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 13.5px; color: #0B1E38; padding-bottom: 10px; margin-bottom: 10px; border-bottom: 1px solid #EEF1F6; }
.wf-mock-app img { height: 16px; width: auto; }
.wf-mock-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 0; font-size: 12.5px; }
.wf-mock-row-label { color: #6B7A93; }
.wf-mock-row-value { font-weight: 700; color: #0B1E38; }
.wf-mock-row--highlight { background: var(--teal-100); margin: 0 -8px; padding: 6px 8px; border-radius: 8px; }
.wf-mock-row--flag .wf-mock-row-value { color: var(--coral-600); }
.wf-mock-row--pending .wf-mock-row-value { color: #B7C0CF; font-style: italic; font-weight: 600; }
.wf-mock-badge {
	display: inline-flex; align-items: center; gap: 5px;
	font-size: 11px; font-weight: 700; padding: 3px 9px; border-radius: 999px;
}
.wf-mock-badge--synced { background: var(--teal-100); color: #0A8F73; }
.wf-mock-badge--flag { background: var(--coral-100); color: var(--coral-700); }
.wf-mock-sync {
	position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
	z-index: 2; width: 44px; height: 44px; border-radius: 50%;
	background: var(--accent-gradient); color: #fff;
	display: flex; align-items: center; justify-content: center;
	box-shadow: var(--shadow-lg);
}
.wf-mock-sync--flag { background: var(--coral-600); }
.wf-mock-sync--success { background: var(--teal-500); }

/* ---- Plan comparison table ---- */
.plan-table-wrap { overflow-x: auto; margin: var(--space-lg) 0; }
.plan-table { width: 100%; border-collapse: collapse; min-width: 640px; }
.plan-table th, .plan-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--border); font-size: 14px; }
.plan-table th { font-size: 12px; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-soft); background: var(--navy-100); }
.plan-table td:not(:first-child), .plan-table th:not(:first-child) { text-align: center; }
.plan-table tr td:first-child { font-weight: 600; }
.plan-table tbody tr.plan-table-section td { background: var(--navy-100); font-weight: 700; color: var(--ink); }

/* ---- Pricing page: summary cards, spec-row cards, billing toggle ---- */
.billing-toggle { display: inline-flex; align-items: center; gap: 10px; background: var(--navy-100); border-radius: 999px; padding: 4px; }
.billing-toggle-btn { border: none; background: none; font-family: inherit; font-size: 14px; font-weight: 600; padding: 8px 16px; border-radius: 999px; color: var(--ink-soft); cursor: pointer; }
.billing-toggle-btn.is-active { background: var(--white); color: var(--ink); box-shadow: var(--shadow-sm); }
.billing-toggle-save { font-size: 12px; font-weight: 700; color: var(--teal-500); background: var(--teal-100); border-radius: 999px; padding: 3px 10px; margin-left: 4px; }

.pricing-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 20px; align-items: stretch; margin-top: var(--space-lg); }
.pricing-card {
	position: relative;
	display: flex;
	flex-direction: column;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	padding: 28px 24px;
	box-shadow: var(--shadow-sm), var(--shadow-inset);
}
.pricing-card--recommended { border-color: var(--accent-strong); border-width: 2px; background: linear-gradient(180deg, var(--coral-100) 0%, var(--white) 26%); }
.pricing-card-badge {
	position: absolute;
	top: -13px;
	left: 50%;
	transform: translateX(-50%);
	background: var(--accent-strong);
	color: var(--white);
	font-size: 11px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .04em;
	padding: 4px 14px;
	border-radius: 999px;
	white-space: nowrap;
}
.pricing-card-name { font-size: 18px; margin: 0 0 6px; }
.pricing-card-tagline { color: var(--ink-soft); font-size: 14px; margin: 0 0 18px; min-height: 40px; }
.pricing-card-price { font-size: 32px; font-weight: 800; margin: 0 0 4px; }
.pricing-card-price .unit { font-size: 15px; font-weight: 500; color: var(--ink-soft); }
.pricing-card-price-note { font-size: 12px; color: var(--ink-soft); margin: 0 0 4px; }
.pricing-card-features { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-direction: column; gap: 10px; flex-grow: 1; }
.pricing-card-features li { display: flex; align-items: flex-start; gap: 8px; font-size: 14px; color: var(--ink-soft); }
.pricing-card-features li svg { flex-shrink: 0; color: var(--accent-strong); margin-top: 2px; }
.pricing-card-features li .muted-item { color: var(--ink-soft); opacity: .6; }
.pricing-card-features-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; color: var(--ink-soft); margin: 0 0 10px; }
.pricing-card .btn { width: 100%; justify-content: center; margin: 4px 0 20px; }
.pricing-plan-fit-link { display: inline-block; background: none; border: none; padding: 0; margin: 6px 0 0; font-family: inherit; font-size: 13px; font-weight: 600; color: var(--accent-strong); text-decoration: underline; cursor: pointer; }

.pricing-card-specs { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-direction: column; gap: 10px; flex-grow: 1; }
.pricing-card-specs li { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; font-size: 13.5px; padding-bottom: 10px; border-bottom: 1px solid var(--border); color: var(--ink-soft); }
.pricing-card-specs li span:last-child { font-weight: 700; color: var(--ink); text-align: right; }

/* ---- Plan comparison table: per-row expandable descriptions ---- */
.plan-table-info-btn {
	background: none;
	border: none;
	padding: 0;
	margin-left: 6px;
	cursor: pointer;
	color: var(--ink-soft);
	vertical-align: middle;
	display: inline-flex;
}
.plan-table-info-btn svg { width: 15px; height: 15px; }
.plan-table-info-btn:hover { color: var(--accent-strong); }
.plan-table-desc-row { display: none; }
.plan-table-desc-row.is-open { display: table-row; }
.plan-table-desc-row td { background: var(--navy-100); font-weight: 400; font-size: 13px; color: var(--ink-soft); font-style: italic; padding: 10px 14px 10px 30px; text-align: left; }

/* ---- "Is this plan for you?" modal ---- */
.pricing-modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0, 17, 43, .55); z-index: 1000; align-items: center; justify-content: center; padding: 20px; }
.pricing-modal-overlay.is-open { display: flex; }
.pricing-modal {
	position: relative;
	background: var(--white);
	border-radius: var(--radius-card);
	max-width: 560px;
	width: 100%;
	max-height: 85vh;
	overflow-y: auto;
	padding: 36px 32px 32px;
}
.pricing-modal-close {
	position: absolute;
	top: 14px;
	right: 14px;
	background: none;
	border: none;
	cursor: pointer;
	color: var(--ink-soft);
	font-size: 24px;
	line-height: 1;
	padding: 6px;
}
.pricing-modal-close:hover { color: var(--ink); }
.pricing-modal h3 { text-align: center; margin: 0 0 6px; }
.pricing-modal-sub { text-align: center; color: var(--ink-soft); font-size: 14px; margin: 0 0 26px; }
.pricing-modal-section-label { font-weight: 700; margin: 0 0 12px; font-size: 15px; }
.pricing-modal-list { list-style: none; padding: 0; margin: 0 0 26px; display: flex; flex-direction: column; gap: 10px; }
.pricing-modal-list li { display: flex; align-items: flex-start; gap: 10px; font-size: 14px; color: var(--ink-soft); }
.pricing-modal-list svg { flex-shrink: 0; margin-top: 2px; }
.pricing-modal-list--yes svg { color: var(--teal-500); }
.pricing-modal-list--no svg { color: var(--coral-500); }
.pricing-modal-cta { text-align: center; border-top: 1px solid var(--border); padding-top: 22px; }
.pricing-modal-cta p { font-size: 14px; color: var(--ink-soft); margin: 0 0 14px; }

/* ---- Blog archive/category hub ---- */
.blog-featured {
	grid-column: 1 / -1;
	display: grid;
	grid-template-columns: 1.1fr 1fr;
	gap: 28px;
	align-items: center;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-lg);
	padding: 24px;
	text-decoration: none;
	color: inherit;
}
.blog-featured-thumb { border-radius: 14px; overflow: hidden; }
.blog-featured-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
.blog-featured-body h2 { margin: 10px 0 8px; font-size: 26px; }
.blog-featured-body p { color: var(--ink-soft); margin: 0 0 14px; }
@media (max-width: 780px) {
	.blog-featured { grid-template-columns: 1fr; }
}
.blog-card {
	position: relative;
	background: var(--white);
	border: 1px solid var(--border);
	border-radius: var(--radius-card);
	overflow: hidden;
	box-shadow: var(--shadow-sm), var(--shadow-inset);
	display: flex;
	flex-direction: column;
	transition: transform .16s ease, box-shadow .16s ease;
}
.blog-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.blog-card-thumb { position: relative; display: block; aspect-ratio: 16/10; background: var(--navy-100); }
.blog-card-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
.blog-card-cat-badge {
	position: absolute; top: 10px; right: 10px; z-index: 2;
	background: rgba(255,255,255,.92); color: var(--ink-soft);
	font-size: 11px; font-weight: 600; line-height: 1.4;
	padding: 4px 10px; border-radius: 999px; text-decoration: none;
}
.blog-card-cat-badge:hover { color: var(--ink); background: var(--white); }
.blog-card-body { padding: 20px; flex: 1; display: flex; flex-direction: column; }
.blog-card-body h3 { font-size: 17px; margin: 10px 0 8px; }
.blog-card-body p { font-size: 14px; color: var(--ink-soft); margin: 0; flex: 1; }
.blog-card-meta { display: flex; align-items: center; gap: 8px; margin-top: 14px; font-size: 12.5px; color: var(--ink-soft); }
.blog-card-meta img { border-radius: 50%; }
/* Whole-card click target: the title link's ::after is stretched to
   cover the entire .blog-card (its nearest positioned ancestor), while
   the category badge sits on a higher z-index so it stays independently
   clickable to its own (different) destination. */
.blog-card-title-link { color: inherit; text-decoration: none; }
.blog-card-title-link.stretched-link::after { content: ""; position: absolute; inset: 0; z-index: 1; }

/* ---- Blog single post: share row + author bio card ---- */
.share-row { display: flex; align-items: center; gap: 8px; }
.share-row a, .share-copy-link {
	display: flex; align-items: center; justify-content: center;
	width: 34px; height: 34px; border-radius: 50%;
	background: var(--navy-100); color: var(--ink-soft);
	border: none; cursor: pointer; transition: background .15s ease, color .15s ease;
}
.share-row a:hover, .share-copy-link:hover { background: var(--accent-soft); color: var(--accent-strong); }
.share-row svg { width: 16px; height: 16px; }
.author-card {
	display: flex; gap: 16px; align-items: flex-start;
	margin-top: var(--space-xl); padding-top: var(--space-lg);
	border-top: 1px solid var(--border);
}
.author-card img { border-radius: 50%; flex-shrink: 0; }
.author-card-name { font-weight: 700; font-size: 15px; margin-bottom: 4px; }
.author-card p { font-size: 14px; color: var(--ink-soft); margin: 0; }

/* Blog single post header — solid-tint card standing in for a banner
   image (matches production getknit.dev's blog header treatment). */
.blog-hero-card {
	background: var(--accent-soft);
	border-radius: var(--radius-card);
	padding: var(--space-2xl) var(--space-xl);
	text-align: center;
	margin: var(--space-lg) 0 var(--space-xl);
}
.blog-hero-meta {
	display: flex; align-items: center; justify-content: center; gap: 8px;
	font-family: var(--font-mono); font-size: 13px; color: var(--ink-soft);
	margin-bottom: var(--space-md);
}
.blog-hero-meta a { color: var(--accent-strong); font-weight: 700; text-decoration: none; }
.blog-hero-meta a:hover { text-decoration: underline; }
.blog-hero-card h1 { margin: 0 auto; max-width: 780px; }
.blog-hero-author-row {
	display: flex; align-items: center; justify-content: center; gap: 24px;
	flex-wrap: wrap; margin-top: var(--space-lg);
}
.blog-hero-author { display: flex; align-items: center; gap: 12px; }
.blog-hero-author img { border-radius: 50%; }
.blog-hero-author-name { font-weight: 700; font-size: 14px; text-align: left; }
.blog-hero-author-time { font-size: 13px; color: var(--ink-soft); text-align: left; }
@media (max-width: 640px) {
	.blog-hero-card { padding: var(--space-xl) var(--space-md); }
	.blog-hero-author-row { justify-content: center; gap: 16px; }
}

/* Blog single post: Table of Contents + two-column article layout. */
.blog-post-layout { display: grid; grid-template-columns: 240px minmax(0, 760px); gap: 48px; align-items: start; justify-content: center; }
.blog-post-body { min-width: 0; }
.entry-content h2, .entry-content h3 { scroll-margin-top: 96px; }
.toc-card {
	background: var(--white); border: 1px solid var(--border); border-radius: var(--radius-card);
	padding: 20px; position: sticky; top: 88px;
}
.toc-card summary {
	font-weight: 700; font-size: 14px; cursor: pointer; list-style: none;
	display: flex; align-items: center; justify-content: space-between; gap: 8px;
}
.toc-card summary::-webkit-details-marker { display: none; }
.toc-card summary::after { content: '\2212'; color: var(--ink-soft); font-size: 16px; flex-shrink: 0; }
.toc-card:not([open]) summary::after { content: '+'; }
.toc-card nav { margin-top: 12px; }
.toc-card ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; max-height: 60vh; overflow-y: auto; }
.toc-card li a { font-size: 13px; line-height: 1.4; color: var(--ink-soft); text-decoration: none; display: block; }
.toc-card li a:hover { color: var(--accent-strong); }
.toc-card li.toc-level-3 { padding-left: 14px; }
@media (max-width: 960px) {
	.blog-post-layout { grid-template-columns: 1fr; }
	.toc-card { position: static; margin-bottom: var(--space-lg); }
}

/* ---- Blog index: hero subscribe, tabs+search row, sectioned "All" view ---- */
.blog-hero-subscribe { max-width: 420px; margin: var(--space-lg) auto 0; }
.blog-hero-subscribe-label { font-size: 14px; color: var(--ink-soft); margin: 0 0 10px; }
.blog-tabs-row {
	display: flex; align-items: center; justify-content: space-between; gap: 16px;
	border-bottom: 1px solid var(--border);
	margin-bottom: var(--space-lg);
}
.blog-tabs-row .tab-strip-nav { border-bottom: none; margin-bottom: 0; flex: 1; }
.blog-search-wrap { position: relative; flex-shrink: 0; }
.blog-search-toggle {
	display: flex; align-items: center; justify-content: center;
	width: 38px; height: 38px; border-radius: 50%;
	background: var(--navy-100); color: var(--ink-soft);
	border: none; cursor: pointer; transition: background .15s ease, color .15s ease;
}
.blog-search-toggle:hover, .blog-search-wrap.is-open .blog-search-toggle { background: var(--accent-soft); color: var(--accent-strong); }
.blog-search-popover {
	position: absolute; top: calc(100% + 10px); right: 0;
	display: flex; align-items: center; gap: 6px;
	width: 280px; padding: 6px 6px 6px 14px;
	background: var(--white); border: 1px solid var(--border); border-radius: 999px;
	box-shadow: var(--shadow-lg);
	opacity: 0; visibility: hidden; transform: translateY(-4px);
	transition: opacity .15s ease, transform .15s ease, visibility .15s ease;
	z-index: 20;
}
.blog-search-wrap.is-open .blog-search-popover { opacity: 1; visibility: visible; transform: translateY(0); }
.blog-search-popover-input { flex: 1; border: none; outline: none; font-size: 14px; font-family: inherit; background: transparent; }
.blog-search-popover button[type="submit"] {
	display: flex; align-items: center; justify-content: center;
	width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
	background: var(--ink); color: var(--white); border: none; cursor: pointer;
}
@media (max-width: 640px) {
	.blog-search-popover { width: calc(100vw - 48px); right: -8px; }
}

.blog-section { margin-top: var(--space-2xl); }
.blog-section-head { margin-bottom: var(--space-md); }
.blog-section-head h2 { margin-bottom: 4px; }
.blog-section-head p { color: var(--ink-soft); font-size: 14.5px; margin: 0; }
.blog-section-more {
	display: inline-flex; align-items: center; gap: 6px;
	margin-top: var(--space-md); font-size: 14px; font-weight: 600;
	color: var(--accent-strong); text-decoration: none;
}
.blog-section-more:hover { text-decoration: underline; }
.blog-section-more svg { width: 16px; height: 16px; }

.blog-subscribe-card {
	margin-top: var(--space-2xl);
	text-align: center;
	background: var(--navy-900);
	color: var(--white);
	border-radius: var(--radius-card);
	padding: var(--space-2xl) var(--space-lg);
}
.blog-subscribe-card h2 { color: var(--white); }
.blog-subscribe-card p { color: rgba(255,255,255,.72); max-width: 46ch; margin: 0 auto var(--space-lg); }
.blog-subscribe-card .newsletter-inline-form { max-width: 360px; margin: 0 auto; }

/* ---- Minimal newsletter signup: one joined input+button, no other
   copy — see template-parts/hubspot-newsletter-form.php. ---- */
.newsletter-inline-form {
	display: flex;
	max-width: 340px;
	border: 1px solid var(--border);
	border-radius: 999px;
	background: var(--white);
	overflow: hidden;
}
.newsletter-inline-form input {
	flex: 1 1 auto; min-width: 0;
	border: none; outline: none; background: transparent;
	padding: 11px 16px;
	font-family: inherit; font-size: 14.5px; color: var(--ink);
}
.newsletter-inline-form button {
	flex-shrink: 0;
	margin: 3px;
	border: none; border-radius: 999px;
	padding: 9px 18px;
	background: var(--accent-gradient); color: #fff;
	font-family: inherit; font-weight: 700; font-size: 14px;
	cursor: pointer;
}
.newsletter-inline-form button:disabled { opacity: .7; cursor: default; }
.newsletter-inline-status { font-size: 12.5px; margin: 8px 0 0; }
.newsletter-inline-status.is-success { color: #067A5E; }
.newsletter-inline-status.is-error { color: var(--danger); }
.blog-subscribe-card .newsletter-inline-status { text-align: center; color: rgba(255,255,255,.75); }

.blog-infinite-sentinel { height: 1px; }
.blog-infinite-status { display: none; text-align: center; color: var(--ink-soft); font-size: 14px; margin-top: var(--space-lg); }
.blog-infinite-status.is-visible { display: block; }
