/**
 * TSF base layer.
 *
 * Deliberately NOT a reset. Tailwind's Preflight would unstyle the admin bar,
 * every Gutenberg block and Elementor's own UI, so nothing here is global:
 * every rule is scoped to .tsf-scope (set on <body> by the theme) or to an
 * explicit tsf- class.
 */

/* ------------------------------------------------------------------ ground */

body.tsf-scope {
	background-color: var(--tsf-bg);
	color: var(--tsf-fg);
	font-family: var(--tsf-font-sans);
	-webkit-font-smoothing: antialiased;
	/* The source also set background-attachment: fixed. Dropped -- it is a known
	   scroll-jank source on iOS and the gradients are static anyway. */
	background-image:
		radial-gradient(80% 50% at 85% 0%, rgba(227, 30, 36, 0.07) 0%, transparent 60%),
		radial-gradient(70% 60% at 0% 100%, rgba(168, 19, 24, 0.08) 0%, transparent 65%);
	background-repeat: no-repeat;
}

.tsf-scope ::selection {
	background: var(--tsf-brand);
	color: var(--tsf-on-brand);
}

.tsf-scope h1,
.tsf-scope h2,
.tsf-scope h3,
.tsf-scope h4 {
	text-wrap: balance;
}

/* --------------------------------------------------------------- typography */

/**
 * Display face.
 *
 * Only font-family, weight and case live here. In the source, `@utility
 * font-display` also declares line-height and letter-spacing, but Tailwind emits
 * that utility BEFORE the core text-size, leading and tracking rules in the same
 * layer — so on any heading that carries a size class (all of them) the core
 * rule wins and font-display's leading never applies. That is why the source has
 * to repeat `leading-[0.95]` by hand, and why the headings that omit it are not
 * 0.95 at all. Putting leading on the size modifier reproduces what actually
 * renders rather than what the utility appears to promise.
 */
.tsf-display {
	font-family: var(--tsf-font-display);
	font-weight: 400;
	text-transform: uppercase;
}

/* The source sizes display type in raw vw, which explodes out of a 100svh hero
   the moment a client lengthens a headline. clamp() degrades instead. */
.tsf-display--xl { font-size: clamp(2.75rem, 12vw, 7.5rem);  line-height: 0.95; letter-spacing: -0.02em; }
.tsf-display--lg { font-size: clamp(2.25rem, 8vw, 4.5rem);   line-height: 0.95; letter-spacing: -0.02em; }
.tsf-display--md { font-size: clamp(1.875rem, 5.5vw, 3rem);  line-height: 0.95; letter-spacing: -0.02em; }
.tsf-display--sm { font-size: clamp(1.5rem, 4vw, 2.25rem);   line-height: 1;    letter-spacing: -0.02em; }

.tsf-eyebrow {
	font-size: 0.625rem;
	font-weight: 700;
	letter-spacing: 0.35em;
	text-transform: uppercase;
	color: var(--tsf-brand);
}

@media (min-width: 640px) {
	.tsf-eyebrow { font-size: 0.75rem; }
}

/* index.tsx and our-story.tsx use a second, non-responsive eyebrow: 12px at
   0.3em rather than 10px-to-12px at 0.35em. Two real variants, not a slip. */
.tsf-eyebrow--wide {
	font-size: 0.75rem;
	line-height: 1.5;
	letter-spacing: 0.3em;
}

@media (min-width: 640px) {
	.tsf-eyebrow--wide { font-size: 0.75rem; }
}

.tsf-lede {
	color: var(--tsf-muted-fg);
	line-height: 1.65;
}

/* ------------------------------------------------------------------ layout */

.tsf-container {
	max-width: var(--tsf-container);
	margin-inline: auto;
	padding-inline: var(--tsf-gutter);
}

.tsf-band {
	padding-block: var(--tsf-band-y);
}

/* The header is fixed and ~89px tall, so an anchor jump would land the section
   title underneath it. Cheaper and smoother than offsetting in anchor.js. */
.tsf-section,
.tsf-scope [id] {
	scroll-margin-top: 6rem;
}

.tsf-band--tight { --tsf-band-y: 3rem; }
.tsf-band--loose { --tsf-band-y: 8rem; }
.tsf-band--none  { --tsf-band-y: 0; }

/* One word of a headline in brand red. */
.tsf-accent { color: var(--tsf-brand); }

/* Section tone -- replaces the source's per-section bg-surface-1 / bg-surface-2 classes. */
.tsf-tone--base    { background-color: transparent; }
.tsf-tone--raised  { background-color: var(--tsf-surface-1); }
.tsf-tone--raised2 { background-color: var(--tsf-surface-2); }

.tsf-rule-top {
	border-top: 2px solid var(--tsf-brand);
}

.tsf-rule-bottom {
	border-bottom: 1px solid var(--tsf-border);
}

/* -------------------------------------------------------------- depth pass */

/**
 * The source picked one of four gradient washes per section with
 * `section:nth-of-type(4n + N)`. That cannot survive Elementor: Containers render
 * as <div class="e-con">, not <section>; nested containers restart the count;
 * `elementor-hidden-mobile` uses display:none, which :nth-of-type still counts;
 * and any injected section shifts every variant below it.
 *
 * So the variant is explicit state on our own wrapper instead. The theme assigns
 * it round-robin at render time when the widget is left on "auto".
 */

[data-tsf-depth] {
	position: relative;
	isolation: isolate;
}

[data-tsf-depth]::before,
[data-tsf-depth]::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: -1;
}

[data-tsf-depth]::after {
	background-image: var(--tsf-grain);
	background-size: 180px 180px;
	opacity: var(--tsf-grain-opacity);
}

[data-tsf-depth="1"]::before {
	background-image:
		radial-gradient(55% 60% at 12% 0%, rgba(227, 30, 36, 0.10) 0%, transparent 70%),
		linear-gradient(160deg, rgba(255, 255, 255, 0.03) 0%, transparent 45%);
}

[data-tsf-depth="2"]::before {
	background-image:
		radial-gradient(60% 70% at 92% 40%, rgba(168, 19, 24, 0.14) 0%, transparent 70%),
		repeating-linear-gradient(45deg, rgba(255, 255, 255, 0.02) 0 1px, transparent 1px 18px);
}

[data-tsf-depth="3"]::before {
	background-image:
		linear-gradient(180deg, rgba(255, 255, 255, 0.035) 0%, transparent 55%),
		radial-gradient(70% 55% at 50% 110%, rgba(227, 30, 36, 0.09) 0%, transparent 70%);
}

[data-tsf-depth="4"]::before {
	background-image:
		radial-gradient(50% 60% at 8% 90%, rgba(227, 30, 36, 0.09) 0%, transparent 70%),
		repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.02) 0 2px, transparent 2px 90px);
}

/* A real opt-out. The source defined .no-depth as `isolation: auto`, which only
   dropped the stacking context and left both pseudo layers painting. */
[data-tsf-depth="none"]::before,
[data-tsf-depth="none"]::after {
	content: none;
}

/* ----------------------------------------------------------------- texture */

.tsf-pitch {
	background-image:
		radial-gradient(ellipse at center, rgba(227, 30, 36, 0.12) 0%, transparent 60%),
		repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.02) 0 2px, transparent 2px 80px),
		repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.02) 0 2px, transparent 2px 80px);
}

.tsf-glow {
	background-image: var(--tsf-hero-glow);
}

/* ----------------------------------------------------------------- buttons */

.tsf-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.5rem;
	border-radius: var(--tsf-radius-pill);
	padding: 0.75rem 2rem;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.15em;
	text-transform: uppercase;
	text-decoration: none;
	cursor: pointer;
	transition: transform 0.2s var(--tsf-ease), background-color 0.2s var(--tsf-ease), color 0.2s var(--tsf-ease), border-color 0.2s var(--tsf-ease);
}

.tsf-btn--brand {
	background-color: var(--tsf-brand);
	color: var(--tsf-on-brand);
	border: 1px solid transparent;
}

.tsf-btn--brand:hover {
	background-color: var(--tsf-brand-bright);
	transform: translateY(-2px);
}

.tsf-btn--ghost {
	background-color: transparent;
	color: var(--tsf-fg);
	border: 1px solid var(--tsf-border-strong);
}

.tsf-btn--ghost:hover {
	background-color: var(--tsf-fg);
	color: var(--tsf-bg);
}

/* The quieter outline used beside a solid red primary. */
.tsf-btn--outline {
	background-color: transparent;
	color: var(--tsf-fg);
	border: 1px solid rgba(255, 255, 255, 0.25);
}

.tsf-btn--outline:hover {
	border-color: var(--tsf-brand);
	color: var(--tsf-brand);
}

.tsf-btn svg,
.tsf-btn i {
	width: 1em;
	height: 1em;
	font-size: 1rem;
	flex: none;
}

.tsf-btn:focus-visible {
	outline: 2px solid var(--tsf-brand-bright);
	outline-offset: 3px;
}

/* -------------------------------------------------------------------- media */

/* Art-directed crops are per-image in the source (object-[53%_38%] and friends).
   Widgets expose it as a focal-point control writing --tsf-focal. */

.tsf-scope .tsf-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: var(--tsf-focal, 50% 50%);
}

/* ----------------------------------------------------------------- motion */

@keyframes tsf-marquee {
	from { transform: translateX(0); }
	to   { transform: translateX(-50%); }
}

@keyframes tsf-fade-up {
	from { opacity: 0; transform: translateY(20px); }
	to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
	.tsf-scope *,
	.tsf-scope *::before,
	.tsf-scope *::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}
}

/* ==========================================================================
   Site header
   ========================================================================== */

.tsf-nav {
	position: fixed;
	inset-inline: 0;
	top: 0;
	z-index: 50;
	border-bottom: 1px solid transparent;
	transition: background-color 0.3s var(--tsf-ease), backdrop-filter 0.3s var(--tsf-ease), border-color 0.3s var(--tsf-ease);
}

/* Transparent over the hero, blurred once the page moves. Elementor sticky
   headers cannot express this: Effects Offset only adds a class, and no
   backdrop-filter control exists anywhere in the product. */
.tsf-nav.is-scrolled {
	background-color: rgba(0, 0, 0, 0.7);
	backdrop-filter: blur(12px);
	border-bottom-color: rgba(255, 255, 255, 0.05);
}

.tsf-nav.is-open {
	background-color: transparent;
	backdrop-filter: none;
	border-bottom-color: transparent;
}

.tsf-nav__bar {
	position: relative;
	z-index: 60;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	padding-block: 1rem;
}

.tsf-nav__logo { display: block; flex: none; line-height: 0; }
.tsf-nav__logo img { height: 3rem; width: auto; }

.tsf-nav__wordmark {
	font-family: var(--tsf-font-display);
	text-transform: uppercase;
	font-size: 1.25rem;
	line-height: 1;
	color: var(--tsf-fg);
}

.tsf-nav__links { display: none; }

.tsf-nav__links a {
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
	color: rgba(255, 255, 255, 0.8);
	transition: color 0.2s var(--tsf-ease);
}

.tsf-nav__links a.is-current { color: var(--tsf-brand); }

@media (hover: hover) {
	.tsf-nav__links a:hover { color: var(--tsf-brand); }
}

.tsf-nav__cta {
	display: none;
	border-radius: var(--tsf-radius-pill);
	background-color: var(--tsf-brand);
	color: var(--tsf-on-brand);
	padding: 0.625rem 1.25rem;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
	transition: transform 0.2s var(--tsf-ease), background-color 0.2s var(--tsf-ease);
}

@media (hover: hover) {
	.tsf-nav__cta:hover { transform: translateY(-2px); background-color: var(--tsf-brand-bright); }
}

.tsf-nav__toggle {
	display: grid;
	place-items: center;
	width: 2.75rem;
	height: 2.75rem;
	flex: none;
	border: 0;
	border-radius: var(--tsf-radius-pill);
	background: transparent;
	color: var(--tsf-fg);
	cursor: pointer;
	transition: background-color 0.2s var(--tsf-ease);
}

.tsf-nav__toggle svg { width: 1.625rem; height: 1.625rem; grid-area: 1 / 1; }

.tsf-nav__icon-close { display: none; }

.tsf-nav.is-open .tsf-nav__toggle {
	background-color: var(--tsf-brand);
	color: var(--tsf-on-brand);
}

.tsf-nav.is-open .tsf-nav__icon-open { display: none; }
.tsf-nav.is-open .tsf-nav__icon-close { display: block; width: 1.375rem; height: 1.375rem; }

.tsf-nav__toggle:focus-visible,
.tsf-nav__links a:focus-visible,
.tsf-nav__cta:focus-visible,
.tsf-nav__logo:focus-visible {
	outline: 2px solid var(--tsf-brand-bright);
	outline-offset: 3px;
}

@media (min-width: 1024px) {
	.tsf-nav__logo img { height: 3.5rem; }
	.tsf-nav__links { display: flex; align-items: center; gap: 1.5rem; }
	.tsf-nav__cta { display: inline-block; }
	.tsf-nav__toggle { display: none; }
}

/* The bar overflows between 1024 and 1280 once the menu passes about 8 items. */
@media (min-width: 1280px) {
	.tsf-nav__links { gap: 2rem; }
}

/* ---- full-screen panel ---- */

.tsf-nav__panel {
	position: fixed;
	inset: 0;
	z-index: 50;
	display: flex;
	flex-direction: column;
	overflow: hidden;
	background-color: rgba(0, 0, 0, 0.95);
	backdrop-filter: blur(4px);
}

.tsf-nav__panel[hidden] { display: none; }

.tsf-nav__blob {
	position: absolute;
	width: 20rem;
	height: 20rem;
	border-radius: var(--tsf-radius-pill);
	pointer-events: none;
}

.tsf-nav__blob--a {
	right: -6rem;
	top: -6rem;
	background: radial-gradient(circle, rgba(227, 30, 36, 0.32) 0%, transparent 70%);
}

.tsf-nav__blob--b {
	bottom: -8rem;
	left: -6rem;
	background: radial-gradient(circle, rgba(168, 19, 24, 0.22) 0%, transparent 70%);
}

.tsf-nav__panel-inner {
	position: relative;
	display: flex;
	flex: 1;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 1rem;
	padding: 6rem 1.5rem 2rem;
}

.tsf-nav__panel-link {
	font-family: var(--tsf-font-display);
	text-transform: uppercase;
	font-size: 7.5vw;
	line-height: 1;
	text-decoration: none;
	color: var(--tsf-fg);
	transition: color 0.2s var(--tsf-ease);
	/* Per-item delay, computed in PHP the way the source computes it in JS. */
	animation: tsf-fade-up 0.35s ease-out var(--tsf-stagger, 0s) both;
}

.tsf-nav__panel-link.is-current { color: var(--tsf-brand); }

@media (hover: hover) {
	.tsf-nav__panel-link:hover { color: var(--tsf-brand); }
}

@media (min-width: 640px) {
	.tsf-nav__panel-inner { gap: 1.25rem; }
	.tsf-nav__panel-link { font-size: 2.25rem; }
}

.tsf-nav__panel-socials {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	margin-top: 2rem;
	animation: tsf-fade-up 0.35s ease-out var(--tsf-stagger, 0s) both;
}

.tsf-nav__panel-socials a {
	display: grid;
	place-items: center;
	width: 2.75rem;
	height: 2.75rem;
	border: 1px solid rgba(255, 255, 255, 0.15);
	border-radius: var(--tsf-radius-pill);
	color: var(--tsf-fg);
	transition: border-color 0.2s var(--tsf-ease), background-color 0.2s var(--tsf-ease), color 0.2s var(--tsf-ease);
}

.tsf-nav__panel-socials svg { width: 1rem; height: 1rem; }

@media (hover: hover) {
	.tsf-nav__panel-socials a:hover {
		border-color: var(--tsf-brand);
		background-color: var(--tsf-brand);
		color: var(--tsf-on-brand);
	}
}

.tsf-nav__panel-cta {
	margin-top: 1.5rem;
	border-radius: var(--tsf-radius-pill);
	background-color: var(--tsf-brand);
	color: var(--tsf-on-brand);
	padding: 0.75rem 2rem;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
	animation: tsf-fade-up 0.35s ease-out var(--tsf-stagger, 0s) both;
}

.tsf-nav__panel a:focus-visible {
	outline: 2px solid var(--tsf-brand-bright);
	outline-offset: 4px;
}

@media (min-width: 1024px) {
	.tsf-nav__panel { display: none; }
}

/* ==========================================================================
   Site footer
   ========================================================================== */

.tsf-footer {
	border-top: 2px solid var(--tsf-brand);
	background-color: var(--tsf-surface-2);
	padding-top: 5rem;
	padding-bottom: 2.5rem;
}

.tsf-footer__grid {
	display: grid;
	gap: 3rem;
}

@media (min-width: 1024px) {
	.tsf-footer__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.tsf-footer__logo { display: inline-block; line-height: 0; }
.tsf-footer__logo img { height: 4rem; width: auto; }

@media (min-width: 1024px) {
	.tsf-footer__logo img { height: 5rem; }
}

.tsf-footer__blurb {
	margin: 1rem 0 0;
	max-width: 20rem;
	font-size: 0.875rem;
	line-height: 1.625;
	color: var(--tsf-muted-fg);
}

.tsf-footer__socials {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	margin-top: 1.5rem;
}

.tsf-footer__socials a {
	display: grid;
	place-items: center;
	width: 2.5rem;
	height: 2.5rem;
	border: 1px solid rgba(255, 255, 255, 0.1);
	border-radius: var(--tsf-radius-pill);
	color: var(--tsf-fg);
	transition: border-color 0.2s var(--tsf-ease), background-color 0.2s var(--tsf-ease), color 0.2s var(--tsf-ease);
}

.tsf-footer__socials svg { width: 1rem; height: 1rem; }

@media (hover: hover) {
	.tsf-footer__socials a:hover {
		border-color: var(--tsf-brand);
		background-color: var(--tsf-brand);
		color: var(--tsf-on-brand);
	}
}

.tsf-footer__title {
	margin: 0 0 1.25rem;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.25em;
	text-transform: uppercase;
	color: var(--tsf-brand);
}

.tsf-footer__list {
	margin: 0;
	padding: 0;
	list-style: none;
	display: grid;
	gap: 0.75rem;
	font-size: 0.875rem;
	color: rgba(255, 255, 255, 0.8);
}

.tsf-footer__list--icons { gap: 1rem; }

.tsf-footer__list a {
	color: inherit;
	text-decoration: none;
	transition: color 0.2s var(--tsf-ease);
}

.tsf-footer__list--icons li,
.tsf-footer__list--icons a {
	display: inline-flex;
	align-items: flex-start;
	gap: 0.5rem;
}

.tsf-footer__list--icons svg {
	width: 0.875rem;
	height: 0.875rem;
	flex: none;
	margin-top: 0.25rem;
	color: var(--tsf-brand);
}

@media (hover: hover) {
	.tsf-footer__list a:hover { color: var(--tsf-brand); }
}

.tsf-footer__list a:focus-visible,
.tsf-footer__socials a:focus-visible {
	outline: 2px solid var(--tsf-brand-bright);
	outline-offset: 3px;
}

.tsf-footer__legal {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: space-between;
	gap: 0.75rem;
	margin-top: 4rem;
	border-top: 1px solid rgba(255, 255, 255, 0.05);
	padding-top: 1.5rem;
	font-size: 0.75rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.5);
}

@media (min-width: 640px) {
	.tsf-footer__legal { flex-direction: row; align-items: center; }
}
