/*
 * Palette set by scripts/set-palette.py.
 *
 * Started from city-modern (graphite, one bright color). Cobalt and taxi yellow swapped for The Real Estate Solution's own charcoal and burnt orange, sampled from the brokerage logo, plus a warm sand.
 *
 *   Solution charcoal #23262B  structure: headings, buttons, footer, the ink
 *   City gray        #C5CEDB  fills, rules, washes — never text
 *   Solution burnt orange #C2531A  the warm accent and the thing to press
 *   Sand             #E3B569  the fourth stop in the rule — fills only
 *
 * Carried in one repeated four-part rule under every heading.
 * Fully light, on a warm ground.
 *
 * Measured (WCAG):
 *   brand on ground    14.3:1
 *   white on brand     15.2:1
 *   coral on ground     4.4:1  large type / fills only
 *   white on coral      4.6:1
 *   white on button     4.6:1
 *   surf on ground      1.5:1  FILLS ONLY
 *   dune on ground      1.8:1  FILLS ONLY
 *   body on ground      9.7:1
 *   accent on tint      5.1:1
 *   muted on tint       6.1:1
 *   faint on tint       4.9:1
 *   white on deep      16.7:1
 *   gold-lt on deep    12.3:1
 */

/* ---------------------------------------------------------------- tokens -- */

:root {
	--tyb-brand:      #23262B;
	--tyb-brand-mid:  #424449;
	--tyb-brand-lt:   #9C9DA0;
	--tyb-brand-pale: #E9E9EA;

	--tyb-accent:       #A74716;
	--tyb-accent-mid:   #C2531A;
	--tyb-accent-lt:    #C5CEDB;
	--tyb-accent-metal: linear-gradient(135deg, #1D1F23 0%, #6C727A 52%, #23262B 100%);

	--tyb-surf:       #C5CEDB;
	--tyb-surf-dk: #838B95;
	--tyb-surf-pale:  #F8F9FB;

	--tyb-coral:      #C2531A;
	--tyb-coral-br:   #C2531A;
	--tyb-coral-dk:   #A74716;
	--tyb-coral-pale: #F9EEE8;

	--tyb-dune:       #E3B569;
	--tyb-dune-dk:    #AA884F;
	--tyb-dune-pale:  #FCF6ED;

	--tyb-gold:       #E3B569;
	--tyb-gold-lt:    #F1DAB4;
	--tyb-gold-pale:  #FBF5EA;

	--tyb-sand:       #E7D2AE;
	--tyb-sand-dp:    #D9BC8C;

	--tyb-red:        #C2531A;

	--tyb-deep:       #1B1E22;
	--tyb-deep-dk:    #16181B;
	--tyb-deep-lt:    #202227;
	--tyb-stone:      #63696E;

	--tyb-ink:        #101113;
	--tyb-tone-ink:   #101113;
	--tyb-body:       #404142;
	--tyb-muted:      #58585A;
	--tyb-faint:      #666768;

	--tyb-white:      #FFFFFF;
	--tyb-shell:      #FCF8F1;
	--tyb-tint:       #F5EDE0;
	--tyb-tint-2:     #ECE5D8;
	--tyb-sky:        #E9E9EA;
	--tyb-line:       #E4DED2;
	--tyb-line-soft:  #F1EBE1;

	--tyb-rvb-bg:       #23262B;
	--tyb-rvb-ink:      #FFFFFF;
	--tyb-rvs2-bg:      #DFE4EB;
	--tyb-rvs2-accent:  #5F6369;
	--tyb-rvs2-line:    #DFE4EB;
	--tyb-rvs3-bg:      #F3DED3;
	--tyb-rvs3-accent:  #A74716;
	--tyb-rvs3-line:    #F3DED3;
	--tyb-rvs4-bg:      #F3E0BF;
	--tyb-rvs4-accent:  #765E37;
	--tyb-rvs4-line:    #F3E0BF;
	--tyb-rv-star:      #A9751E;
	--tyb-rvb-star:     #E3B569;
	--tyb-rvs2-star:    #AC761E;
	--tyb-rvs3-star:    #A9751E;
	--tyb-rvs4-star:    #A9751E;

	--tyb-menu-slate:   #212224;
	--tyb-menu-mark:    #C2531A;
	--tyb-menu-fill:    #EEEEEE;
	--tyb-pop-ground:     #23262B;
	--tyb-pop-star:       #E3B569;
	--tyb-ink-rgb:        16, 17, 19;

	--tyb-display:    'Instrument Serif', ui-serif, Georgia, 'Times New Roman', serif;
	--tyb-body-font:  'Instrument Sans', ui-sans-serif, -apple-system, 'Segoe UI', sans-serif;

	--tyb-wrap:       1280px;
	--tyb-gutter:     clamp(1.25rem, 4vw, 3rem);
	--tyb-band:       clamp(4rem, 8vw, 7rem);

	--tyb-header-h:   128px;
	--tyb-bar-max:    128px;
	--tyb-bar-min:    76px;
	--tyb-logo-max:   92px;
	--tyb-logo-min:   56px;
	--tyb-shrink:     0;

	--tyb-ease:       cubic-bezier(.22, .61, .36, 1);
	--tyb-shadow:     0 1px 2px rgba(var(--tyb-ink-rgb), .05), 0 8px 24px -12px rgba(var(--tyb-ink-rgb), .16);
	--tyb-shadow-lg:  0 2px 4px rgba(var(--tyb-ink-rgb), .06), 0 20px 48px -20px rgba(var(--tyb-ink-rgb), .24);
}


@media (max-width: 1040px) {
	:root {
		--tyb-header-h: 96px;
		--tyb-bar-max:  96px;
		--tyb-bar-min:  62px;
		--tyb-logo-max: 68px;
		--tyb-logo-min: 38px;
	}
}

/* ------------------------------------------------------------------ base -- */

*, *::before, *::after { box-sizing: border-box; }

html {
	scroll-behavior: smooth;
	scroll-padding-top: 6rem;
	-webkit-text-size-adjust: 100%;
}

body {
	margin: 0;
	background: var(--tyb-shell);
	color: var(--tyb-body);
	font-family: var(--tyb-body-font);
	font-size: clamp(1rem, .97rem + .16vw, 1.0625rem);
	line-height: 1.72;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	/* CLIP, never hidden. `hidden` makes the body a scroll container and kills
	   every position:sticky below it (trap 38); `clip` does not. Do not put an
	   overflow rule on `html` as well — that broke the sticky masthead. */
	overflow-x: clip;
}

body.tyb-locked { overflow: hidden; }

img, svg { max-width: 100%; display: block; }

a { color: var(--tyb-deep-lt); text-decoration: none; transition: color .2s var(--tyb-ease); }
a:hover { color: var(--tyb-deep); }

h1, h2, h3, h4 {
	margin: 0;
	font-family: var(--tyb-display);
	font-weight: 400;
	line-height: 1.16;
	letter-spacing: -.018em;
	color: var(--tyb-ink);
	text-wrap: balance;
}

h1 { font-size: clamp(2.1rem, 1.4rem + 3vw, 3.6rem); }
h2 { font-size: clamp(1.6rem, 1.2rem + 1.9vw, 2.5rem); }
h3 { font-size: clamp(1.1rem, 1.03rem + .4vw, 1.3rem); }

p { margin: 0 0 1.1em; }
p:last-child { margin-bottom: 0; }
ul, ol { margin: 0; padding: 0; list-style: none; }

:focus-visible { outline: 2px solid var(--tyb-deep-lt); outline-offset: 3px; border-radius: 3px; }
::selection { background: var(--tyb-accent-lt); color: var(--tyb-ink); }

.tyb-sr {
	position: absolute; width: 1px; height: 1px;
	padding: 0; margin: -1px; overflow: hidden;
	clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.tyb-skip {
	position: absolute; top: -100px; left: 1rem; z-index: 200;
	padding: .75rem 1.25rem;
	background: var(--tyb-deep); color: #fff; font-weight: 600;
	transition: top .2s var(--tyb-ease);
}
.tyb-skip:focus { top: 1rem; color: #fff; }

/* --------------------------------------------------------------- layout -- */

.tyb-wrap {
	width: 100%;
	max-width: var(--tyb-wrap);
	margin-inline: auto;
	padding-inline: var(--tyb-gutter);
}

.tyb-wrap--narrow { max-width: 60rem; }

.tyb-section { position: relative; padding-block: var(--tyb-band); }

.tyb-section--tint { background: var(--tyb-tint); }

/* The two navy bands. Full-bleed colour is the only thing on a light site that
   gives the eye a place to rest, so there are exactly two per page and they are
   always separated by white. */
.tyb-section--dark {
	background: var(--tyb-deep);
	color: rgba(255, 255, 255, .82);
}

.tyb-section--dark h1,
.tyb-section--dark h2,
.tyb-section--dark h3 { color: #fff; }

/* ------------------------------------------------------------- typography -- */

.tyb-eyebrow {
	display: inline-block;
	margin-bottom: .9rem;
	font-family: var(--tyb-display);
	font-size: .72rem;
	font-weight: 400;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}

.tyb-eyebrow--light {
	/*
	 * Trap 66. This used to be var(--tyb-accent-lt), with a near-white
	 * override scoped to `.tyb-hero` immediately below — so the HOME PAGE
	 * always passed and every inner banner page put a brand colour on a
	 * photograph at around 2:1. Six sites shipped that way and no front-page
	 * audit can see it, because the failing rule is the one the home page
	 * never uses. The light eyebrow only ever sits on a photograph, so there
	 * is no case where a brand colour is right.
	 */
	color: #fff;
	text-shadow: 0 1px 2px rgba(10, 12, 16, .6), 0 1px 14px rgba(10, 12, 16, .5);
}


.tyb-hero__title { text-shadow: 0 1px 2px rgba(10, 12, 16, .55), 0 2px 18px rgba(10, 12, 16, .45); }

.tyb-rule {
	display: block;
	width: 56px; height: 3px;
	margin: 1.1rem 0 1.4rem;
	background: var(--tyb-accent-metal);
	border-radius: 3px;
}

.tyb-head--center .tyb-rule,
.tyb-closer .tyb-rule,
.tyb-modal__head .tyb-rule { margin-inline: auto; }

.tyb-lede {
	font-size: clamp(1.02rem, 1rem + .3vw, 1.2rem);
	line-height: 1.65;
	color: var(--tyb-muted);
	max-width: 56ch;
}

.tyb-head { max-width: 46rem; margin-bottom: clamp(2.25rem, 4vw, 3.25rem); }
.tyb-head--center { margin-inline: auto; text-align: center; }
.tyb-head--center .tyb-lede { margin-inline: auto; }
.tyb-head--light .tyb-lede { color: rgba(255, 255, 255, .8); }

.tyb-head--split {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1.5rem;
	max-width: none;
}
@media (max-width: 720px) {
	.tyb-head--split { flex-direction: column; align-items: flex-start; }
}

.tyb-prose { color: var(--tyb-body); }
.tyb-prose p { margin-bottom: 1.1em; }

.tyb-prose--editor h2,
.tyb-prose--editor h3 { margin: 2rem 0 .75rem; }
.tyb-prose--editor ul,
.tyb-prose--editor ol { margin: 0 0 1.2em 1.25rem; list-style: disc; }
.tyb-prose--editor ol { list-style: decimal; }
.tyb-prose--editor li { margin-bottom: .4em; }
.tyb-prose--article { font-size: 1.05rem; }
.tyb-prose--article p { margin-bottom: 1.3em; }

.tyb-pull {
	margin: 1.75rem 0 0;
	padding: 1.1rem 1.4rem;
	border-left: 3px solid var(--tyb-accent);
	background: var(--tyb-tint);
	border-radius: 0 4px 4px 0;
	font-family: var(--tyb-display);
	font-size: clamp(1rem, .97rem + .3vw, 1.15rem);
	font-weight: 400;
	line-height: 1.45;
	color: var(--tyb-ink);
}

/* --------------------------------------------------------------- buttons -- */

.tyb-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: .5rem;
	padding: .9rem 1.6rem;
	border: 1px solid var(--tyb-deep);
	border-radius: 4px;
	background: var(--tyb-deep);
	color: #fff;
	font-family: var(--tyb-display);
	font-size: .82rem;
	font-weight: 400;
	letter-spacing: .05em;
	text-transform: uppercase;
	line-height: 1;
	cursor: pointer;
	transition: transform .2s var(--tyb-ease), box-shadow .2s var(--tyb-ease), background .2s var(--tyb-ease);
	-webkit-appearance: none;
	appearance: none;
}

.tyb-btn:hover {
	background: var(--tyb-deep-dk);
	border-color: var(--tyb-deep-dk);
	color: #fff;
	transform: translateY(-2px);
	box-shadow: 0 12px 24px -12px rgba(16, 17, 19, .5);
}
.tyb-btn:active { transform: translateY(0); }

/*
 * The primary call to action.
 *
 * Three things here were inherited from a gold-era build and were all wrong
 * once the gradient became navy: a comment claiming the fill was gold, dark
 * navy ink (#15171A) sitting on a navy gradient — effectively invisible — and
 * a gold drop shadow. White on #23262B is 9.8:1 and needs no argument.
 */
.tyb-btn--accent {
	background: var(--tyb-accent-metal);
	border-color: transparent;
	color: #FFFFFF;
}
.tyb-btn--accent:hover {
	background: var(--tyb-accent-metal);
	filter: brightness(1.08);
	color: #FFFFFF;
	box-shadow: 0 12px 26px -12px rgba(35, 38, 43, .55);
}

.tyb-btn--ghost {
	background: transparent;
	border-color: var(--tyb-line);
	color: var(--tyb-deep);
}
.tyb-btn--ghost:hover {
	background: var(--tyb-tint);
	border-color: var(--tyb-deep);
	color: var(--tyb-deep);
	box-shadow: none;
}

.tyb-btn--ghost-light {
	background: transparent;
	border-color: rgba(255, 255, 255, .5);
	color: #fff;
}
.tyb-btn--ghost-light:hover {
	background: rgba(255, 255, 255, .12);
	border-color: #fff;
	color: #fff;
	box-shadow: none;
}

.tyb-btn--sm { padding: .68rem 1.1rem; font-size: .74rem; }
.tyb-btn--lg { padding: 1.05rem 2rem; font-size: .88rem; }
.tyb-btn--block { display: flex; width: 100%; }

/* -------------------------------------------------------------- utility -- */

.tyb-utility {
	position: relative;
	z-index: 60;
	background: var(--tyb-deep);
	color: rgba(255, 255, 255, .72);
	font-size: .78rem;
}

.tyb-utility__inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.5rem;
	min-height: 40px;
	padding-block: .35rem;
}

.tyb-utility__tagline {
	margin: 0;
	font-family: var(--tyb-display);
	font-size: .7rem;
	font-weight: 400;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--tyb-accent-lt);
	white-space: nowrap;
}

.tyb-utility__list { display: flex; align-items: center; gap: 1.4rem; }

.tyb-utility__list a {
	display: inline-flex;
	align-items: center;
	gap: .4rem;
	color: rgba(255, 255, 255, .82);
}
.tyb-utility__list a:hover { color: #fff; }

.tyb-icon { flex-shrink: 0; color: var(--tyb-accent-lt); transition: color .2s var(--tyb-ease); }
.tyb-utility__list a:hover .tyb-icon { color: #fff; }

@media (max-width: 1040px) {
	/* Gone entirely on mobile. It was a strip of navy holding a phone number and
	   an email in 12px type — the phone is now a proper button in the masthead,
	   which is a real target and does not cost a band of colour above the logo. */
	.tyb-utility { display: none; }
}

/* ------------------------------------------------------------- language -- */

/*
 * EN / ES.
 *
 * A segmented pair rather than a dropdown: with exactly two languages a select
 * costs a tap to discover what it even contains, and both labels visible is its
 * own advertisement — a Spanish speaker sees "ES" without hunting for it, which
 * is the whole point of the feature.
 *
 * The inactive side is a link and the active side is not, so keyboard order
 * carries no dead stop and screen readers get aria-current on the live one.
 */
.tyb-lang {
	display: inline-flex;
	align-items: center;
	gap: 1px;
	padding: 2px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .14);
	font-size: .72rem;
	font-weight: 600;
	letter-spacing: .06em;
}

.tyb-lang__on,
.tyb-lang__off {
	display: inline-block;
	padding: .18rem .55rem;
	border-radius: 999px;
	line-height: 1.5;
}

.tyb-lang__on {
	background: #fff;
	color: var(--tyb-deep);
}

.tyb-utility__list .tyb-lang__off {
	color: rgba(255, 255, 255, .8);
	transition: background .18s var(--tyb-ease), color .18s var(--tyb-ease);
}

.tyb-utility__list .tyb-lang__off:hover {
	background: rgba(255, 255, 255, .16);
	color: #fff;
}


/* --------------------------------------------------------------- header -- */

/* Constant-height shell; only the bar inside it moves. Collapsing the header
   itself would shorten the document mid-scroll and drag the page up under the
   reader — see themes/CLAUDE.md. */
.tyb-header {
	position: sticky;
	top: 0;
	z-index: 100;
	height: var(--tyb-header-h);
	pointer-events: none;
}

.tyb-header__bar {
	pointer-events: auto;
	background: #fff;
	border-bottom: 1px solid var(--tyb-line);
	box-shadow: 0 8px 24px -18px rgba(16, 17, 19, calc(1.4 * var(--tyb-shrink)));
}

.tyb-header__inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.5rem;
	min-height: calc(var(--tyb-bar-max) + (var(--tyb-bar-min) - var(--tyb-bar-max)) * var(--tyb-shrink));
}

.tyb-brand { display: inline-flex; flex-shrink: 0; }
.tyb-logo { display: inline-flex; align-items: center; gap: .65rem; }

.tyb-logo__img {
	height: calc(var(--tyb-logo-max) + (var(--tyb-logo-min) - var(--tyb-logo-max)) * var(--tyb-shrink));
	width: auto;
}

.tyb-logo__mark { display: inline-flex; }
.tyb-logo__mark svg { width: 40px; height: 40px; }
.tyb-logo--footer .tyb-logo__mark svg { width: 46px; height: 46px; }

.tyb-logo__text { display: flex; flex-direction: column; line-height: 1.05; }

.tyb-logo__name {
	font-family: var(--tyb-display);
	font-size: 1.32rem;
	font-weight: 400;
	letter-spacing: -.01em;
	color: var(--tyb-deep);
}

.tyb-logo__sub {
	margin-top: .18rem;
	font-family: var(--tyb-display);
	font-size: .62rem;
	font-weight: 400;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}

.tyb-logo--footer .tyb-logo__name { color: #fff; }
.tyb-logo--footer .tyb-logo__img { height: 74px; }

/* ------------------------------------------------------------------ nav -- */

.tyb-nav { margin-inline: auto; }
.tyb-nav__list { display: flex; align-items: center; gap: clamp(.9rem, 1.8vw, 1.9rem); }

.tyb-nav__list a {
	position: relative;
	display: inline-block;
	padding-block: .35rem;
	font-family: var(--tyb-display);
	font-size: .8rem;
	font-weight: 400;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--tyb-ink);
}

.tyb-nav__list a::after {
	content: '';
	position: absolute;
	left: 0; bottom: 0;
	width: 0; height: 2px;
	background: var(--tyb-accent-metal);
	transition: width .25s var(--tyb-ease);
}

.tyb-nav__list a:hover { color: var(--tyb-deep); }
.tyb-nav__list a:hover::after,
.tyb-nav__list .is-current > a::after,
.tyb-nav__list .current-menu-item > a::after { width: 100%; }
.tyb-nav__list .is-current > a,
.tyb-nav__list .current-menu-item > a { color: var(--tyb-deep); }

.tyb-header__actions { display: flex; align-items: center; gap: .7rem; flex-shrink: 0; }

.tyb-burger {
	display: none;
	padding: .55rem;
	background: none;
	border: 1px solid var(--tyb-line);
	border-radius: 4px;
	cursor: pointer;
}
.tyb-burger__box { display: block; width: 20px; }
.tyb-burger__box i {
	display: block; height: 2px; background: var(--tyb-deep);
	transition: transform .25s var(--tyb-ease), opacity .2s var(--tyb-ease);
}
.tyb-burger__box i + i { margin-top: 4px; }


@media (max-width: 1040px) {
	.tyb-nav { display: none; }
	.tyb-burger { display: block; }
}
@media (max-width: 620px) {
	/* The "Talk to an agent" button goes; the call button stays. Excluded by
	   name rather than by raising specificity elsewhere — this rule is more
	   specific than .tyb-callnow and would otherwise win silently. */
	.tyb-header__actions .tyb-btn:not(.tyb-callnow) { display: none; }
}


/* --------------------------------------------------------------- figures -- */

.tyb-figure {
	position: relative;
	margin: 0;
	overflow: hidden;
	border-radius: 6px;
	background: var(--tyb-tint-2);
}

.tyb-figure img { width: 100%; height: 100%; object-fit: cover; }

.tyb-figure--cover { position: absolute; inset: 0; border-radius: 0; }
.tyb-figure--tall { aspect-ratio: 4 / 5; }
.tyb-figure--portrait { aspect-ratio: 3 / 4; }
.tyb-figure--wide { aspect-ratio: 16 / 10; }
.tyb-figure--hero { aspect-ratio: 16 / 9; border-radius: 8px; }
.tyb-figure--lead { margin-bottom: 2rem; }

.tyb-figure--empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: .75rem;
	min-height: 12rem;
	background:
		repeating-linear-gradient(135deg, transparent 0 12px, rgba(16, 17, 19, .03) 12px 24px),
		var(--tyb-tint-2);
}

.tyb-figure__mark { opacity: .5; }
.tyb-figure__note {
	font-family: var(--tyb-display);
	font-size: .66rem;
	font-weight: 400;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--tyb-faint);
}

/* ------------------------------------------------------------------ hero -- */

.tyb-hero {
	position: relative;
	display: flex;
	align-items: center;
	min-height: clamp(30rem, 74vh, 42rem);
	padding-block: clamp(5rem, 10vh, 7rem);
	overflow: hidden;
	background: #070809;
}

.tyb-hero__media { position: absolute; inset: 0; z-index: 0; }

/* Warm, not navy.
 *
 * The hero is a house at golden hour, and a navy scrim was arguing with it —
 * the sky went slate, the lit windows went grey, and the one genuinely
 * attractive thing about the photograph was suppressed to make room for a brand
 * colour it did not need. The scrim is now a deep warm brown, which darkens
 * exactly as much for the text but reads as dusk rather than as a blue filter.
 *
 * The amber wash on the right is doing the opposite job: it sits over the part
 * of the frame with no text on it and lifts the water, so the colour is
 * strongest where the eye is free to enjoy it.
 *
 * Temperature matters here. The copied theme scrimmed in warm brown, which over
 * a blue-green aerial reads as dirt on the lens. This one is a deep ocean blue
 * drawn from --tyb-deep, so the photograph stays in the same family as the logo.
 * The photograph is also a top-down aerial and therefore busy edge to edge —
 * there is no empty sky to drop type onto — so the left side is scrimmed harder
 * than a normal hero would need. */
/*
 * A LIGHT hero. This is the fifth version of this decision in the repo and it
 * is settled: Adam has rejected dark twice and rejected light-with-dark-bands
 * as still too dark. The version inherited here scrimmed the left edge at 0.92
 * navy, which turned a bright aerial of a sunlit barrier island into a navy
 * panel with a photograph faintly behind it.
 *
 * So the scrim is low and NEUTRAL — a warm-grey dark rather than navy, because
 * a blue scrim over blue water grades the footage toward the brand colour,
 * which is the thing not to do. Legibility comes from the text shadow on
 * .tyb-hero__title and .tyb-hero__lede instead, which darkens only the pixels
 * immediately behind the letterforms and leaves the picture alone. Measured
 * with scripts/hero-contrast.py, not eyeballed.
 */
.tyb-hero__scrim {
	position: absolute;
	inset: 0;
	background:
		/*
		 * A BAND, not a blanket. The headline measured 2.58:1 against the
		 * brightest stretch of beach behind it and large text needs 3:1, so
		 * the fix is a soft horizontal band of extra density across the rows
		 * the type actually occupies — roughly 26% to 66% of the hero — while
		 * the sky at the top and the surf at the bottom stay as bright as the
		 * footage shot them. Darkening the whole picture to fix one line is
		 * what produced the navy panel this replaced.
		 */
		linear-gradient(to bottom, rgba(16, 18, 22, 0) 16%, rgba(16, 18, 22, .30) 30%, rgba(16, 18, 22, .30) 62%, rgba(16, 18, 22, 0) 78%),
		linear-gradient(to right, rgba(16, 18, 22, .58) 0%, rgba(16, 18, 22, .40) 44%, rgba(16, 18, 22, .06) 76%, rgba(16, 18, 22, .12) 100%),
		linear-gradient(to bottom, rgba(16, 18, 22, .14) 0%, rgba(16, 18, 22, .00) 38%, rgba(16, 18, 22, .26) 100%);
}

.tyb-hero__inner { position: relative; z-index: 2; max-width: 54rem; }
.tyb-hero__title { color: #fff; }
.tyb-hero__lede { color: rgba(255, 255, 255, .88); max-width: 46ch; margin-top: 1.25rem; }

.tyb-hero__actions { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 2rem; }

.tyb-hero__note {
	margin-top: 1.35rem;
	font-size: .84rem;
	color: rgba(255, 255, 255, .62);
}

/* ---------------------------------------------------------------- banner -- */

.tyb-banner {
	position: relative;
	display: flex;
	align-items: flex-end;
	min-height: clamp(16rem, 38vh, 22rem);
	padding-block: clamp(4rem, 9vh, 6rem) clamp(2rem, 5vh, 3rem);
	overflow: hidden;
	background: var(--tyb-deep-dk);
}

.tyb-banner__media { position: absolute; inset: 0; z-index: 0; }
.tyb-banner__scrim {
	position: absolute;
	inset: 0;
	background:
		linear-gradient(to right, rgba(16, 18, 22, .62) 0%, rgba(16, 18, 22, .46) 55%, rgba(16, 18, 22, .30) 100%),
		linear-gradient(to bottom, rgba(16, 18, 22, .24) 0%, rgba(16, 18, 22, .12) 50%, rgba(16, 18, 22, .42) 100%);
}

.tyb-banner__inner { position: relative; z-index: 2; max-width: 56rem; }
.tyb-banner__title { color: #fff; }
.tyb-banner__lede { color: rgba(255, 255, 255, .85); }

/* Banners with no photograph still need to be navy, not a white void. */
.tyb-banner:not(:has(.tyb-banner__media)) { background: var(--tyb-deep); }

/* ----------------------------------------------------------------- split -- */

.tyb-split {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
	align-items: center;
	gap: clamp(2rem, 5vw, 4rem);
}

.tyb-split--reverse .tyb-split__media { order: 2; }
.tyb-split--reverse .tyb-split__body { order: 1; }
.tyb-split__body .tyb-lede { margin-bottom: 1.25rem; }
.tyb-split__body .tyb-btn { margin-top: 1.5rem; }

@media (max-width: 900px) {
	.tyb-split { grid-template-columns: 1fr; }
	.tyb-split--reverse .tyb-split__media,
	.tyb-split--reverse .tyb-split__body { order: initial; }
	.tyb-figure--tall, .tyb-figure--portrait { aspect-ratio: 16 / 11; }
}

/* ----------------------------------------------------------- cards, grid -- */

.tyb-cards {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr));
	gap: 1.5rem;
}

.tyb-card {
	display: flex;
	flex-direction: column;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	overflow: hidden;
	transition: transform .28s var(--tyb-ease), box-shadow .28s var(--tyb-ease), border-color .28s var(--tyb-ease);
}

.tyb-card:hover {
	transform: translateY(-4px);
	border-color: transparent;
	box-shadow: var(--tyb-shadow-lg);
}

.tyb-card__media { position: relative; display: block; }
.tyb-card__media .tyb-figure { border-radius: 0; }
.tyb-card__media img { transition: transform .5s var(--tyb-ease); }
.tyb-card:hover .tyb-card__media img { transform: scale(1.035); }

.tyb-card__status {
	position: absolute;
	top: .75rem; left: .75rem;
	padding: .35rem .7rem;
	border-radius: 3px;
	background: var(--tyb-deep);
	color: #fff;
	font-family: var(--tyb-display);
	font-size: .66rem;
	font-weight: 400;
	letter-spacing: .1em;
	text-transform: uppercase;
}

/* A sold listing should not look like an available one. */
.tyb-status--sold,
.tyb-status--closed { background: var(--tyb-ink); }
.tyb-status--pending,
.tyb-status--under-contract { background: var(--tyb-accent); color: #FFFFFF; }
.tyb-status--coming-soon { background: var(--tyb-deep-lt); }

.tyb-card__body { display: flex; flex-direction: column; padding: 1.35rem 1.35rem 1.5rem; }

.tyb-card__price {
	margin-bottom: .35rem;
	font-family: var(--tyb-display);
	font-size: 1.3rem;
	font-weight: 400;
	color: var(--tyb-deep);
}

.tyb-card__title { font-size: 1.05rem; margin-bottom: .5rem; }
.tyb-card__title a { color: var(--tyb-ink); }
.tyb-card__title a:hover { color: var(--tyb-deep); }

.tyb-card__addr {
	display: flex;
	align-items: center;
	gap: .4rem;
	margin-bottom: .9rem;
	font-size: .88rem;
	color: var(--tyb-muted);
}
.tyb-card__addr .tyb-icon { color: var(--tyb-accent); }

.tyb-card__specs {
	display: flex;
	flex-wrap: wrap;
	gap: .35rem 1.1rem;
	margin-top: auto;
	padding-top: .9rem;
	border-top: 1px solid var(--tyb-line-soft);
	font-size: .84rem;
	color: var(--tyb-body);
}
.tyb-card__specs li { display: inline-flex; align-items: center; gap: .35rem; }
.tyb-card__specs .tyb-icon { color: var(--tyb-deep-lt); }

.tyb-card__date {
	margin-bottom: .4rem;
	font-family: var(--tyb-display);
	font-size: .7rem;
	font-weight: 400;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}
.tyb-card__text { font-size: .93rem; color: var(--tyb-muted); margin-bottom: 1rem; }

.tyb-count {
	margin-bottom: 1.75rem;
	font-size: .88rem;
	color: var(--tyb-muted);
}

/* --------------------------------------------------------------- services -- */

.tyb-services {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
	gap: 1.25rem;
}

.tyb-service {
	display: flex;
	flex-direction: column;
	padding: 2rem 1.6rem;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	color: inherit;
	transition: transform .28s var(--tyb-ease), box-shadow .28s var(--tyb-ease), border-color .28s var(--tyb-ease);
}
.tyb-service:hover {
	transform: translateY(-4px);
	border-color: transparent;
	box-shadow: var(--tyb-shadow-lg);
	color: inherit;
}

.tyb-service__num {
	margin-bottom: .9rem;
	font-family: var(--tyb-display);
	font-size: 1.6rem;
	font-weight: 400;
	line-height: 1;
	color: var(--tyb-accent);
}
.tyb-service__title { margin-bottom: .5rem; }
.tyb-service__text { font-size: .93rem; color: var(--tyb-muted); margin-bottom: 1.25rem; }

.tyb-service__link {
	margin-top: auto;
	font-family: var(--tyb-display);
	font-size: .74rem;
	font-weight: 400;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tyb-deep);
}
.tyb-service__link::after {
	content: ' \2192';
	display: inline-block;
	transition: transform .25s var(--tyb-ease);
}
.tyb-service:hover .tyb-service__link::after,
.tyb-card:hover .tyb-service__link::after { transform: translateX(4px); }

/* --------------------------------------------------------------- pillars -- */

.tyb-pillars {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
	gap: 1.25rem;
}

.tyb-pillar {
	padding: 1.75rem 1.5rem;
	background: rgba(255, 255, 255, .06);
	border: 1px solid rgba(255, 255, 255, .14);
	border-radius: 8px;
}
.tyb-pillar__title { margin-bottom: .6rem; font-size: 1.05rem; }
.tyb-pillar__body { font-size: .92rem; color: rgba(255, 255, 255, .78); margin: 0; }

/* ----------------------------------------------------------------- steps -- */

.tyb-steps {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
	gap: 1.5rem;
}
.tyb-step { padding-top: 1.5rem; border-top: 2px solid var(--tyb-line); }
.tyb-step__num {
	display: block;
	margin-bottom: .7rem;
	font-family: var(--tyb-display);
	font-size: 1.7rem;
	font-weight: 400;
	line-height: 1;
	color: var(--tyb-accent);
}
.tyb-step__title { margin-bottom: .4rem; }
.tyb-step__text { font-size: .92rem; color: var(--tyb-muted); margin: 0; }

/* ---------------------------------------------------------------- quotes -- */

.tyb-quotes {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 19rem), 1fr));
	gap: 1.5rem;
}

.tyb-quote {
	margin: 0;
	padding: 1.9rem 1.6rem;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
}
.tyb-quote__stars { color: var(--tyb-accent); letter-spacing: .12em; margin-bottom: .9rem; }
.tyb-quote blockquote { margin: 0 0 1.1rem; color: var(--tyb-body); }
.tyb-quote figcaption { display: flex; flex-direction: column; gap: .15rem; }
.tyb-quote__name { font-family: var(--tyb-display); font-weight: 400; color: var(--tyb-ink); font-size: .92rem; }
.tyb-quote__via { font-size: .8rem; color: var(--tyb-faint); }

/* ------------------------------------------------------------------ team -- */

.tyb-team { display: grid; gap: 2rem; }

.tyb-member {
	display: grid;
	grid-template-columns: minmax(0, 18rem) minmax(0, 1fr);
	gap: clamp(1.5rem, 4vw, 3rem);
	align-items: center;
	padding: clamp(1.5rem, 3vw, 2.25rem);
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
}

@media (max-width: 760px) {
	.tyb-member { grid-template-columns: 1fr; }
}

.tyb-member__photo { position: relative; }

.tyb-member__initials {
	display: flex;
	align-items: center;
	justify-content: center;
	aspect-ratio: 3 / 4;
	border-radius: 6px;
	background: var(--tyb-deep);
	color: var(--tyb-accent-lt);
	font-family: var(--tyb-display);
	font-size: 3.5rem;
	font-weight: 400;
	letter-spacing: .04em;
}

.tyb-member__name { margin-bottom: .2rem; }
.tyb-member__role {
	font-family: var(--tyb-display);
	font-size: .78rem;
	font-weight: 400;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}
.tyb-member__bio { color: var(--tyb-body); margin-bottom: 1.1rem; }
.tyb-member__contact { display: flex; flex-wrap: wrap; gap: .5rem 1.5rem; }
.tyb-member__contact a { display: inline-flex; align-items: center; gap: .4rem; font-size: .9rem; }
.tyb-member__contact .tyb-icon { color: var(--tyb-accent); }

.tyb-joinus {
	margin-top: 2rem;
	padding: clamp(1.75rem, 4vw, 2.5rem);
	background: var(--tyb-tint);
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	text-align: center;
}
.tyb-joinus h2 { font-size: 1.3rem; margin-bottom: .6rem; }
.tyb-joinus p { max-width: 52ch; margin-inline: auto; margin-bottom: 1.4rem; color: var(--tyb-muted); }

/* -------------------------------------------------------------- listing -- */

.tyb-listing { padding-block: clamp(2rem, 5vw, 3rem) 0; }
.tyb-listing__head { margin-bottom: 1.75rem; }

.tyb-crumb { font-size: .82rem; color: var(--tyb-faint); margin-bottom: 1rem; }
.tyb-crumb span { margin-inline: .4rem; }

.tyb-listing__titles {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1.5rem;
	flex-wrap: wrap;
}
.tyb-listing__addr {
	display: flex;
	align-items: center;
	gap: .4rem;
	margin-top: .6rem;
	color: var(--tyb-muted);
}
.tyb-listing__addr .tyb-icon { color: var(--tyb-accent); }
.tyb-listing__price { text-align: right; }
.tyb-listing__amount {
	font-family: var(--tyb-display);
	font-size: clamp(1.5rem, 1.2rem + 1.2vw, 2.1rem);
	font-weight: 400;
	color: var(--tyb-deep);
	margin-bottom: .4rem;
}
.tyb-listing__price .tyb-card__status { position: static; display: inline-block; }

.tyb-facts {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(50%, 9rem), 1fr));
	gap: 1px;
	margin-top: 1.75rem;
	background: var(--tyb-line);
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	overflow: hidden;
}
.tyb-facts li { padding: 1.1rem 1.25rem; background: #fff; text-align: center; }
.tyb-facts__value {
	display: block;
	font-family: var(--tyb-display);
	font-size: 1.35rem;
	font-weight: 400;
	color: var(--tyb-ink);
}
.tyb-facts__label {
	display: block;
	margin-top: .2rem;
	font-size: .78rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--tyb-faint);
}

.tyb-listing__body {
	display: grid;
	grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
	gap: clamp(2rem, 4vw, 3.5rem);
	align-items: start;
	padding-block: clamp(2.5rem, 5vw, 4rem);
}
@media (max-width: 900px) { .tyb-listing__body { grid-template-columns: 1fr; } }

.tyb-listing__galleryhead { margin-top: 2.5rem; }
.tyb-gallery {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
	gap: 1rem;
}

.tyb-askbox {
	position: sticky;
	top: calc(var(--tyb-header-h) + 1.5rem);
	padding: 1.75rem 1.6rem;
	background: var(--tyb-tint);
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
}
.tyb-askbox h2 { font-size: 1.2rem; margin-bottom: .5rem; }
.tyb-askbox p { font-size: .92rem; color: var(--tyb-muted); margin-bottom: 1.25rem; }
.tyb-askbox__call {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: .45rem;
	margin-top: .9rem;
	font-family: var(--tyb-display);
	font-weight: 400;
	color: var(--tyb-deep);
}

/* ----------------------------------------------------------------- empty -- */

.tyb-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 1rem;
	max-width: 34rem;
	margin-inline: auto;
	padding: clamp(2.5rem, 5vw, 3.5rem);
	text-align: center;
	background: var(--tyb-tint);
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
}
.tyb-empty__mark { opacity: .7; }
.tyb-empty h2 { font-size: 1.3rem; }
.tyb-empty p { color: var(--tyb-muted); margin-bottom: .5rem; }

/* ------------------------------------------------------------------ faqs -- */

.tyb-faqs { display: grid; gap: .75rem; }

.tyb-faq {
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 6px;
}
.tyb-faq[open] { border-color: var(--tyb-deep-lt); }

.tyb-faq__q {
	position: relative;
	padding: 1.15rem 3rem 1.15rem 1.35rem;
	font-family: var(--tyb-display);
	font-size: 1rem;
	font-weight: 400;
	color: var(--tyb-ink);
	cursor: pointer;
	list-style: none;
}
.tyb-faq__q::-webkit-details-marker { display: none; }
.tyb-faq__q:hover { color: var(--tyb-deep); }

.tyb-faq__q::after,
.tyb-faq__q::before {
	content: '';
	position: absolute;
	right: 1.35rem; top: 50%;
	width: 12px; height: 2px;
	background: var(--tyb-accent);
	transition: transform .25s var(--tyb-ease);
}
.tyb-faq__q::before { transform: translateY(-50%) rotate(90deg); }
.tyb-faq__q::after { transform: translateY(-50%); }
.tyb-faq[open] .tyb-faq__q::before { transform: translateY(-50%) rotate(0deg); }

.tyb-faq__a { margin: 0; padding: 0 3rem 1.35rem 1.35rem; color: var(--tyb-muted); }

/* ---------------------------------------------------------------- contact -- */

.tyb-contact {
	display: grid;
	grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
	gap: clamp(2rem, 5vw, 3.5rem);
	align-items: start;
}
@media (max-width: 900px) { .tyb-contact { grid-template-columns: 1fr; } }

.tyb-contact__form .tyb-form { margin-top: 1.75rem; }

.tyb-contact__aside {
	display: grid;
	gap: 1px;
	background: var(--tyb-line);
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	overflow: hidden;
}
.tyb-contact__block { padding: 1.4rem 1.5rem; background: #fff; }
.tyb-contact__heading {
	margin-bottom: .4rem;
	font-family: var(--tyb-display);
	font-size: .68rem;
	font-weight: 400;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}
.tyb-contact__big {
	display: inline-block;
	font-family: var(--tyb-display);
	font-size: 1.1rem;
	font-weight: 400;
	color: var(--tyb-ink);
	word-break: break-word;
}
.tyb-contact__big:hover { color: var(--tyb-deep); }
.tyb-contact__note, .tyb-contact__text { margin: .3rem 0 0; font-size: .9rem; color: var(--tyb-muted); }
.tyb-contact__text { color: var(--tyb-body); }

.tyb-contact__seal {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: .6rem;
	padding: 1.75rem 1.5rem;
	text-align: center;
	background: var(--tyb-deep);
}
.tyb-contact__seal p {
	margin: 0;
	font-family: var(--tyb-display);
	font-size: .78rem;
	font-weight: 400;
	color: rgba(255, 255, 255, .82);
}
.tyb-contact__seal .tyb-mark { filter: brightness(1.6); }

/* ------------------------------------------------------------------ form -- */

.tyb-form { display: grid; gap: 1rem; }
.tyb-field { display: grid; gap: .4rem; min-width: 0; }
.tyb-field__row {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 11rem), 1fr));
	gap: 1rem;
}

.tyb-field label {
	font-family: var(--tyb-display);
	font-size: .74rem;
	font-weight: 400;
	letter-spacing: .07em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}
.tyb-field label span { color: var(--tyb-accent); }

.tyb-field input,
.tyb-field select,
.tyb-field textarea {
	width: 100%;
	padding: .8rem .95rem;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 5px;
	color: var(--tyb-ink);
	font-family: var(--tyb-body-font);
	font-size: 1rem;
	line-height: 1.5;
	transition: border-color .2s var(--tyb-ease), box-shadow .2s var(--tyb-ease);
	-webkit-appearance: none;
	appearance: none;
}

.tyb-field textarea { resize: vertical; min-height: 8rem; }

.tyb-field select {
	background-image:
		linear-gradient(45deg, transparent 50%, var(--tyb-deep) 50%),
		linear-gradient(135deg, var(--tyb-deep) 50%, transparent 50%);
	background-position: calc(100% - 20px) calc(50% + 2px), calc(100% - 14px) calc(50% + 2px);
	background-size: 6px 6px, 6px 6px;
	background-repeat: no-repeat;
	padding-right: 2.75rem;
	cursor: pointer;
}

.tyb-field input:focus,
.tyb-field select:focus,
.tyb-field textarea:focus {
	border-color: var(--tyb-deep-lt);
	box-shadow: 0 0 0 3px rgba(197, 206, 219, .12);
	outline: none;
}

.tyb-field input::placeholder, .tyb-field textarea::placeholder { color: var(--tyb-faint); }

/* Off-screen rather than display:none — some bots skip explicitly hidden
   fields, and this one is meant to be filled in. */
.tyb-trap {
	position: absolute !important;
	left: -9999px !important;
	width: 1px; height: 1px; overflow: hidden;
}

.tyb-form__note { margin: 0; font-size: .9rem; min-height: 1.4em; }
.tyb-form__note.is-ok { color: #1E7A4C; }
.tyb-form__note.is-bad { color: #C0392B; }
.tyb-form.is-sending { opacity: .6; pointer-events: none; }

.tyb-alert {
	padding: .9rem 1.15rem;
	margin-bottom: 1.5rem;
	border-left: 3px solid var(--tyb-deep);
	background: var(--tyb-tint);
	border-radius: 0 4px 4px 0;
	font-size: .94rem;
}
.tyb-alert--ok { border-left-color: #1E7A4C; color: #1E7A4C; }
.tyb-alert--bad { border-left-color: #C0392B; color: #C0392B; }

/* ----------------------------------------------------------------- modal -- */

.tyb-modal {
	position: fixed;
	inset: 0;
	z-index: 120;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--tyb-gutter);
	opacity: 0;
	visibility: hidden;
	transition: opacity .25s var(--tyb-ease), visibility .25s var(--tyb-ease);
}
.tyb-modal[hidden] { display: flex; }
.tyb-modal.is-open { opacity: 1; visibility: visible; }

.tyb-modal__veil {
	position: absolute;
	inset: 0;
	background: rgba(16, 17, 19, .55);
	backdrop-filter: blur(4px);
	-webkit-backdrop-filter: blur(4px);
}

.tyb-modal__panel {
	position: relative;
	width: 100%;
	max-width: 38rem;
	max-height: min(90vh, 52rem);
	overflow-y: auto;
	padding: clamp(1.75rem, 4vw, 2.5rem);
	background: #fff;
	border-radius: 10px;
	box-shadow: var(--tyb-shadow-lg);
	transform: translateY(14px) scale(.99);
	transition: transform .3s var(--tyb-ease);
}
.tyb-modal.is-open .tyb-modal__panel { transform: translateY(0) scale(1); }

.tyb-modal__panel::before {
	content: '';
	position: absolute;
	top: 0; left: 0; right: 0;
	height: 4px;
	background: var(--tyb-accent-metal);
	border-radius: 10px 10px 0 0;
}

.tyb-modal__close {
	position: absolute;
	top: .8rem; right: .8rem;
	width: 2.25rem; height: 2.25rem;
	display: flex; align-items: center; justify-content: center;
	background: none;
	border: 1px solid transparent;
	border-radius: 4px;
	color: var(--tyb-muted);
	font-size: 1.55rem;
	line-height: 1;
	cursor: pointer;
	transition: color .2s var(--tyb-ease), border-color .2s var(--tyb-ease);
}
.tyb-modal__close:hover { color: var(--tyb-deep); border-color: var(--tyb-line); }

.tyb-modal__head { margin-bottom: 1.6rem; text-align: center; }
.tyb-modal__head h2 { font-size: clamp(1.3rem, 1.15rem + .9vw, 1.7rem); }
.tyb-modal__lede { margin: 0; font-size: .94rem; color: var(--tyb-muted); }

/* ---------------------------------------------------------------- closer -- */

.tyb-closer {
	position: relative;
	padding-block: clamp(3.5rem, 7vw, 5.5rem);
	background: var(--tyb-deep);
	color: rgba(255, 255, 255, .82);
	text-align: center;
	overflow: hidden;
}

.tyb-closer::before {
	content: '';
	position: absolute;
	top: -45%; left: 50%;
	width: 44rem; height: 44rem;
	transform: translateX(-50%);
	background: radial-gradient(circle, rgba(217, 223, 232, .17) 0%, transparent 62%);
	pointer-events: none;
}

.tyb-closer__inner { position: relative; max-width: 44rem; margin-inline: auto; }
.tyb-closer__title { color: #fff; }
.tyb-closer__lede { color: rgba(255, 255, 255, .82); margin-inline: auto; margin-top: 1rem; }
.tyb-closer__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: .8rem; margin-top: 2rem; }

/* ----------------------------------------------------------------- posts -- */

.tyb-posts { display: grid; gap: 2.25rem; }
.tyb-post { padding-bottom: 2.25rem; border-bottom: 1px solid var(--tyb-line); }
.tyb-post__date {
	font-family: var(--tyb-display);
	font-size: .7rem;
	font-weight: 400;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}
.tyb-post__title { margin: .4rem 0 .6rem; }
.tyb-post__excerpt { color: var(--tyb-muted); margin: 0; }

.tyb-backlink { margin-top: 2.5rem; font-family: var(--tyb-display); font-weight: 400; }

.tyb-pagination { margin-top: 2.75rem; }
.tyb-pagination .nav-links { display: flex; gap: .5rem; flex-wrap: wrap; }
.tyb-pagination .page-numbers {
	padding: .5rem .9rem;
	border: 1px solid var(--tyb-line);
	border-radius: 4px;
	color: var(--tyb-body);
	font-size: .88rem;
}
.tyb-pagination .page-numbers.current,
.tyb-pagination .page-numbers:hover {
	border-color: var(--tyb-deep);
	background: var(--tyb-deep);
	color: #fff;
}

/* --------------------------------------------- syndicated legal documents -- */

/* Light site, so the plugin's inline color:#000000 is survivable here — but it
   is still forced to the body colour so legal pages match everything else. */
.bb-legal-container,
.bb-legal-container * { color: var(--tyb-body) !important; }
.bb-legal-container { max-width: 70ch; }
.bb-legal-container h1,
.bb-legal-container h2,
.bb-legal-container h3,
.bb-legal-container strong,
.bb-legal-container b { color: var(--tyb-ink) !important; }
.bb-legal-container h2,
.bb-legal-container h3 { margin: 2.25rem 0 .75rem; line-height: 1.25; font-family: var(--tyb-display); }
.bb-legal-container p, .bb-legal-container li { margin-bottom: 1em; }
.bb-legal-container ul, .bb-legal-container ol { margin: 0 0 1.25em 1.25rem; list-style: disc; }
.bb-legal-container ol { list-style: decimal; }
.bb-legal-container a { color: var(--tyb-deep-lt) !important; text-decoration: underline; }
.bb-legal-container hr { border: 0; border-top: 1px solid var(--tyb-line); margin: 2rem 0; }

/* ---------------------------------------------------------------- reveal -- */

@media (prefers-reduced-motion: no-preference) {
	html.js [data-tyb-reveal] {
		opacity: 0;
		transform: translateY(16px);
		transition: opacity .7s var(--tyb-ease), transform .7s var(--tyb-ease);
	}
	html.js [data-tyb-reveal].is-in { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
	html { scroll-behavior: auto; }
	*, *::before, *::after {
		animation-duration: .01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .01ms !important;
	}
}

/* ------------------------------------------------------------------ misc -- */

@media (max-width: 620px) {
	.tyb-section { padding-block: clamp(3rem, 10vw, 4rem); }
	.tyb-card__body { padding: 1.15rem; }
	.tyb-service { padding: 1.6rem 1.3rem; }
	.tyb-listing__titles { flex-direction: column; align-items: flex-start; }
	.tyb-listing__price { text-align: left; }
}

body.admin-bar .tyb-header { top: 32px; }
@media (max-width: 782px) { body.admin-bar .tyb-header { top: 46px; } }

/* -------------------------------------------------------- nav dropdowns -- */

.tyb-nav__item { position: relative; display: flex; align-items: center; gap: .2rem; }

/* The chevron is a button, not decoration: on a touch screen there is no hover,
   so the parent link has to stay a link and something else has to open the
   submenu. */
.tyb-nav__toggle {
	display: inline-flex;
	align-items: center;
	padding: .25rem;
	background: none;
	border: 0;
	color: var(--tyb-ink);
	cursor: pointer;
	transition: transform .2s var(--tyb-ease);
}
.tyb-nav__item.is-open > .tyb-nav__toggle { transform: rotate(180deg); }

.tyb-nav__sub {
	position: absolute;
	top: 100%;
	left: -1rem;
	min-width: 15rem;
	padding: .5rem 0;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 6px;
	box-shadow: var(--tyb-shadow-lg);
	opacity: 0;
	visibility: hidden;
	transform: translateY(6px);
	transition: opacity .2s var(--tyb-ease), transform .2s var(--tyb-ease), visibility .2s var(--tyb-ease);
	z-index: 20;
}

.tyb-nav__item:hover > .tyb-nav__sub,
.tyb-nav__item:focus-within > .tyb-nav__sub,
.tyb-nav__item.is-open > .tyb-nav__sub {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
}

.tyb-nav__sub a {
	display: block;
	padding: .55rem 1.1rem;
	font-size: .78rem;
	text-transform: none;
	letter-spacing: .01em;
	color: var(--tyb-body);
}
.tyb-nav__sub a::after { display: none; }
.tyb-nav__sub a:hover { background: var(--tyb-tint); color: var(--tyb-deep); }


/* The row is the control, so it should look like one under the finger. */


/* A proper hit target — the chevron is the control that opens the section, and
   on a phone it has to be thumb-sized rather than icon-sized. */


/* ----------------------------------------------------------- credentials -- */

/* White, not navy. It sat directly beneath a navy-scrimmed hero and the two ran
   together as one undifferentiated slab of blue. */
.tyb-creds { background: #fff; border-bottom: 1px solid var(--tyb-line); }

.tyb-creds__list {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(50%, 13rem), 1fr));
	gap: 1px;
	background: var(--tyb-line);
}

.tyb-creds__list li {
	padding: 1.5rem 1.25rem;
	background: #fff;
	text-align: center;
}

.tyb-creds__label {
	display: block;
	font-family: var(--tyb-display);
	font-size: 1.02rem;
	font-weight: 400;
	color: var(--tyb-deep);
}
.tyb-creds__note {
	display: block;
	margin-top: .3rem;
	font-size: .82rem;
	color: var(--tyb-muted);
}

/* ----------------------------------------------------------------- paths -- */

.tyb-paths {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr));
	gap: clamp(1.5rem, 3vw, 2.5rem);
}

.tyb-path {
	display: flex;
	flex-direction: column;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	overflow: hidden;
	transition: transform .28s var(--tyb-ease), box-shadow .28s var(--tyb-ease);
}
.tyb-path:hover { transform: translateY(-4px); box-shadow: var(--tyb-shadow-lg); }

.tyb-path__media .tyb-figure { border-radius: 0; }
.tyb-path__body { padding: clamp(1.5rem, 3vw, 2.25rem); }
.tyb-path__title { font-size: clamp(1.35rem, 1.1rem + 1vw, 1.8rem); }
.tyb-path__text { color: var(--tyb-muted); margin-bottom: 1.5rem; }

/* ----------------------------------------------------------------- creed -- */

.tyb-creed__inner { max-width: 52rem; margin-inline: auto; text-align: center; }

.tyb-creed__quote { margin: 0; }

.tyb-creed__goal {
	font-family: var(--tyb-display);
	font-size: clamp(1.3rem, 1.1rem + 1.2vw, 1.95rem);
	font-weight: 400;
	line-height: 1.3;
	color: #fff;
	margin-bottom: 1.5rem;
}

.tyb-creed__close {
	font-size: clamp(1rem, .97rem + .3vw, 1.12rem);
	color: var(--tyb-accent-lt);
	font-weight: 500;
}

.tyb-creed__attrib {
	margin-top: 1.25rem;
	font-family: var(--tyb-display);
	font-size: .76rem;
	font-weight: 400;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, .6);
}

.tyb-creed__actions {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: .8rem;
	margin-top: 2rem;
}

/* ------------------------------------------------------- valuation call -- */

.tyb-valuecta {
	display: grid;
	grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
	align-items: center;
	gap: clamp(1.5rem, 4vw, 3rem);
	padding: clamp(1.75rem, 4vw, 2.75rem);
	background: var(--tyb-tint);
	border: 1px solid var(--tyb-line);
	border-left: 4px solid var(--tyb-accent-mid);
	border-radius: 8px;
}
@media (max-width: 820px) { .tyb-valuecta { grid-template-columns: 1fr; } }

.tyb-valuecta h2 { margin-bottom: .6rem; }
.tyb-valuecta p { color: var(--tyb-muted); margin: 0; }
.tyb-valuecta__act { display: flex; flex-direction: column; align-items: flex-start; gap: .9rem; }

.tyb-valuecta__call {
	display: inline-flex;
	align-items: center;
	gap: .45rem;
	font-family: var(--tyb-display);
	font-weight: 400;
	color: var(--tyb-deep);
}
.tyb-valuecta__call .tyb-icon { color: var(--tyb-accent-mid); }

/* Both step lists are four items. auto-fit put three on one row and left the
   fourth stranded beside a hole, so the count is pinned instead: four across,
   then two, then one. Two never orphans a four-item list. */
.tyb-steps--wide { grid-template-columns: repeat(4, 1fr); }

@media (max-width: 1120px) { .tyb-steps--wide { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px)  { .tyb-steps--wide { grid-template-columns: 1fr; } }

.tyb-quotes__more { margin-top: 2rem; text-align: center; }

/* Pillars sit on navy by default; this is the variant for a light band. */
.tyb-pillars--light .tyb-pillar {
	background: #fff;
	border-color: var(--tyb-line);
}
.tyb-pillars--light .tyb-pillar__title { color: var(--tyb-ink); }
.tyb-pillars--light .tyb-pillar__body { color: var(--tyb-muted); }

/* ---------------------------------------------------------------- footer -- */

/* Same structure as themes/brokerboost-flagship, but white.
 *
 * The flagship paints it with --bbt-primary. Here the closing band above it is
 * already navy, so a navy footer made the bottom fifth of every page one
 * continuous blue block with a hairline through it. White separates the two and
 * lets the logo sit on its own background without a plate. */

/*
 * The footer, continuous with the closer above it.
 *
 * It used to be white with a cream legal strip, which meant the bottom of every
 * page was three surfaces in a row: a glowing navy band, a hard edge, white, and
 * then cream. The glow Adam liked was doing its work and then hitting a wall an
 * inch below.
 *
 * Now the closer and the footer share one ground, with no border between them,
 * and a second much wider glow sits at the top of the footer continuing the same
 * light. Read together they are one object: light falls from the closer's
 * headline and dies out somewhere around the legal line.
 *
 * Everything else is subtraction — the logo came down from 96px, the columns
 * tightened, and the legal strip is now a darker shelf rather than a different
 * material.
 */
.tyb-foot {
	position: relative;
	background: var(--tyb-deep);
	color: rgba(255, 255, 255, .70);
	overflow: hidden;
}

/* The continuation of the closer's light. Wider and fainter than the one above
   it, so it reads as the same source falling further rather than a second lamp. */
.tyb-foot::before {
	content: '';
	position: absolute;
	top: -70%; left: 50%;
	width: 74rem; height: 52rem;
	transform: translateX(-50%);
	background: radial-gradient(ellipse at center, rgba(217, 223, 232, .10) 0%, transparent 64%);
	pointer-events: none;
}

.tyb-foot__in {
	position: relative;
	display: flex;
	flex-wrap: wrap;
	gap: clamp(28px, 4.5vw, 68px);
	padding-block: clamp(40px, 5vw, 60px);
}

.tyb-foot__brand { flex: 1 1 300px; }
.tyb-foot__col { flex: 0 1 190px; }

.tyb-foot__brand .tyb-logo { margin-bottom: .9rem; }
.tyb-foot__brand .tyb-logo__img { height: 64px; }

.tyb-foot__name { margin: 0; font-family: var(--tyb-display); font-size: 1.1rem; font-weight: 400; color: #fff; }
.tyb-foot__firm {
	margin: 2px 0 12px;
	font-size: .7rem;
	font-weight: 400;
	letter-spacing: .14em;
	text-transform: uppercase;
	/* --tyb-accent is a dark blue and vanishes here; the light tint is the only
	   member of the brand family that survives on this ground. */
	color: var(--tyb-brand-lt);
}
.tyb-foot__blurb { margin: 0; max-width: 40ch; color: rgba(255, 255, 255, .60); font-size: .9rem; }

.tyb-foot__h {
	margin: 0 0 12px;
	font-family: var(--tyb-display);
	font-size: .68rem;
	font-weight: 400;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, .45);
}

.tyb-foot__menu { list-style: none; margin: 0; padding: 0; }
.tyb-foot__menu a,
.tyb-foot__link {
	display: block;
	padding: 4px 0;
	color: rgba(255, 255, 255, .72);
	text-decoration: none;
	font-size: .92rem;
	transition: color .18s var(--tyb-ease);
}
.tyb-foot__menu a:hover,
.tyb-foot__link:hover { color: #fff; text-decoration: none; }

.tyb-foot__addr { margin: 12px 0 0; color: rgba(255, 255, 255, .55); font-size: .88rem; }
.tyb-foot__social { margin: 14px 0 0; font-size: .88rem; }
.tyb-foot__social a { color: var(--tyb-brand-lt); }

/* A darker shelf rather than a different material. The hairline is white at low
   alpha so it reads as a fold in the same surface, not a seam between two. */
.tyb-foot__legal {
	position: relative;
	border-top: 1px solid rgba(255, 255, 255, .09);
	background: rgba(0, 0, 0, .18);
}
.tyb-foot__legal-in { padding-block: 20px; font-size: .76rem; color: rgba(255, 255, 255, .48); line-height: 1.65; }
.tyb-foot__legal-in p { margin: 0 0 6px; }
.tyb-foot__legal-in a { color: rgba(255, 255, 255, .68); }
.tyb-foot__legal-in a:hover { color: #fff; }

.tyb-foot__legalnav { display: flex; flex-wrap: wrap; gap: .35rem 1.25rem; margin: 10px 0; }
.tyb-foot__legalnav a { text-decoration: underline; text-underline-offset: 2px; }

.tyb-foot__eho { display: flex; align-items: center; gap: 8px; }

/* The Equal Housing mark is now real SVG geometry — see tyb_eho_mark(). */
.tyb-eho { flex: 0 0 auto; opacity: .85; }

/* --------------------------------------------------------- property search -- */

/* A mockup. It has to look like a working search or it undersells the site, and
   it has to be obviously a form or nobody will try it. */

.tyb-searchband {
	position: relative;
	z-index: 5;
	/* Rides up over the hero so it reads as part of it. */
	margin-top: -3.5rem;
	padding-bottom: 1rem;
}
@media (max-width: 900px) { .tyb-searchband { margin-top: -1.5rem; } }

.tyb-section--searchtop { padding-bottom: clamp(1.5rem, 3vw, 2.25rem); }
.tyb-section--tight { padding-top: clamp(1.5rem, 3vw, 2.5rem); }

.tyb-search {
	padding: 1.1rem 1.25rem;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 10px;
	box-shadow: var(--tyb-shadow-lg);
}

.tyb-search--page { box-shadow: var(--tyb-shadow); }

.tyb-search__row {
	display: grid;
	grid-template-columns: 2fr 1fr 1fr 1fr auto;
	gap: .75rem;
	align-items: end;
}
@media (max-width: 900px) {
	.tyb-search__row { grid-template-columns: 1fr 1fr; }
	.tyb-search__field--wide { grid-column: 1 / -1; }
	.tyb-search__submit { grid-column: 1 / -1; }
}

.tyb-search__field { display: grid; gap: .3rem; min-width: 0; }

.tyb-search__field label {
	font-family: var(--tyb-display);
	font-size: .68rem;
	font-weight: 400;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}

.tyb-search__field input,
.tyb-search__field select {
	width: 100%;
	padding: .7rem .8rem;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 5px;
	color: var(--tyb-ink);
	font-family: var(--tyb-body-font);
	font-size: .95rem;
	line-height: 1.4;
	-webkit-appearance: none;
	appearance: none;
	transition: border-color .2s var(--tyb-ease), box-shadow .2s var(--tyb-ease);
}

.tyb-search__field select {
	background-image:
		linear-gradient(45deg, transparent 50%, var(--tyb-deep) 50%),
		linear-gradient(135deg, var(--tyb-deep) 50%, transparent 50%);
	background-position: calc(100% - 18px) calc(50% + 1px), calc(100% - 12px) calc(50% + 1px);
	background-size: 6px 6px, 6px 6px;
	background-repeat: no-repeat;
	padding-right: 2.4rem;
	cursor: pointer;
}

.tyb-search__field input:focus,
.tyb-search__field select:focus {
	border-color: var(--tyb-deep-lt);
	box-shadow: 0 0 0 3px rgba(197, 206, 219, .12);
	outline: none;
}

.tyb-search__submit .tyb-btn { width: 100%; padding-block: .78rem; }

.tyb-search__more { margin-top: .85rem; }
.tyb-search__more summary {
	display: inline-block;
	font-family: var(--tyb-display);
	font-size: .72rem;
	font-weight: 400;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--tyb-deep-lt);
	cursor: pointer;
	list-style: none;
}
.tyb-search__more summary::-webkit-details-marker { display: none; }
.tyb-search__more summary::after { content: ' +'; }
.tyb-search__more[open] summary::after { content: ' \2013'; }

.tyb-search__row--more {
	grid-template-columns: repeat(auto-fit, minmax(min(50%, 11rem), 1fr));
	margin-top: .85rem;
	padding-top: .85rem;
	border-top: 1px solid var(--tyb-line-soft);
}

/* ------------------------------------------------------------------ creed -- */

.tyb-creed__call {
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	color: rgba(255, 255, 255, .86);
	font-size: .98rem;
}
.tyb-creed__call strong { color: var(--tyb-accent-lt); }
.tyb-creed__call:hover { color: #fff; }
.tyb-creed__call .tyb-icon { color: var(--tyb-accent-lt); }

.tyb-glyph { color: var(--tyb-faint); }

/* ---------------------------------------------------------------- slider -- */

/* A real horizontal scroller with scroll-snap, not a JS carousel. Trackpad,
   swipe, keyboard and the arrow buttons all work without special-casing any of
   them — the buttons just call scrollBy(). */

.tyb-slider__controls { display: flex; align-items: center; gap: .5rem; }

.tyb-slider__btn {
	width: 2.5rem;
	height: 2.5rem;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 50%;
	color: var(--tyb-deep);
	cursor: pointer;
	transition: background .2s var(--tyb-ease), border-color .2s var(--tyb-ease), opacity .2s var(--tyb-ease);
}
.tyb-slider__btn:hover { background: var(--tyb-deep); border-color: var(--tyb-deep); color: #fff; }
.tyb-slider__btn[disabled] { opacity: .35; cursor: default; }
.tyb-slider__btn[disabled]:hover { background: #fff; border-color: var(--tyb-line); color: var(--tyb-deep); }

.tyb-slider__track {
	display: grid;
	grid-auto-flow: column;
	/* Likewise a floor that is not zero, so the track overflows. */
	/* The cap used to be a flat 21rem, which is narrower than the container on
	   any phone above ~400px: a 336px card sat in a 390px track and left ~54px
	   of dead space on the right, so the carousel read as left-aligned rather
	   than centred. Falling back to 100% of the track means the card fills the
	   width on a phone and still peeks the next one on a tablet. */
	grid-auto-columns: min(84vw, 21rem, 100%);
	gap: 1.25rem;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scroll-behavior: smooth;
	/* Room for the card hover lift and its shadow, which would otherwise be
	   clipped by the scroll container. */
	padding: .5rem .25rem 1.5rem;
	margin-inline: -.25rem;
	scrollbar-width: thin;
}

.tyb-slider__track::-webkit-scrollbar { height: 6px; }
.tyb-slider__track::-webkit-scrollbar-thumb { background: var(--tyb-line); border-radius: 6px; }
.tyb-slider__track::-webkit-scrollbar-track { background: transparent; }

.tyb-slider__slide { scroll-snap-align: start; min-width: 0; }

/*
 * On a phone the card is centred in the viewport with a symmetric peek either
 * side, rather than sitting flush against the left gutter with one card showing
 * on the right. Both are legitimate; this one reads as deliberate rather than
 * as a grid that happened to be cut off, which is the point on a site whose job
 * is to look more expensive than the client's current one.
 *
 * The negative margin lets the track escape the wrap's gutter so the peeking
 * cards run to the screen edge; the matching scroll-padding is what actually
 * centres the snap target, and without it the first and last cards cannot reach
 * the middle.
 */
/*
 * ON A PHONE THE CARD GOES ALL THE WAY ACROSS (Adam, 2026-09-28).
 *
 * It used to be 78vw with an 11vw peek either side, on the theory that a
 * centred card with a symmetric peek "reads as deliberate". On a 390px screen
 * that is a 304px card with 43px of dead gutter down both edges, and what it
 * actually reads as is a card that did not fit. A listing photograph is the
 * most expensive thing on the page and it was being shown at 78% of the width
 * available to it.
 *
 * Now the card spans the full content width, one per screen, and the track
 * still scrolls and snaps. The 1.5rem right padding is what makes the next
 * card peek by a sliver so the row is still legibly a scroller -- without it a
 * full-width card looks like a static image.
 */
@media (max-width: 899px) {
	.tyb-slider__track {
		grid-auto-columns: 100%;
		margin-inline: 0;
		padding-inline: 0 1.5rem;
		scroll-padding-inline: 0;
	}
	.tyb-slider__slide { scroll-snap-align: start; }
}
.tyb-slider__slide .tyb-card { height: 100%; }

@media (min-width: 900px) {
	/* A FIXED track width, not minmax(0, …).
	 *
	 * With a zero minimum every column is allowed to shrink, and a grid inside
	 * an overflow container will always take that offer — so twelve slides
	 * collapsed to 80px each and squeezed into the visible width instead of
	 * overflowing. scrollWidth equalled clientWidth, which is the tell: nothing
	 * to scroll, because nothing overflowed. A single length forces the track to
	 * that size and the container to scroll. */
	.tyb-slider__track { grid-auto-columns: calc((100% - 2.5rem) / 3); }
}

/* ------------------------------------------------- masthead over the hero -- */

/*
 * On the front page the masthead floats over the hero photograph and resolves
 * to the normal white bar as you scroll. Everywhere else it is opaque from the
 * first pixel, because only the front page has a dark image to float over.
 *
 * Two mechanisms, deliberately:
 *
 *   - the BACKGROUND interpolates continuously off --tyb-shrink, so the bar
 *     arrives smoothly rather than snapping;
 *   - the FOREGROUND (nav text, logo, CTA) swaps on the .is-solid class the
 *     scroll handler sets past 60%, with a transition doing the blending.
 *
 * The foreground is not interpolated through the same variable on purpose.
 * Doing so makes legibility depend on a value JS rewrites every frame, and the
 * failure mode is white text on a white bar. A class is either present or not,
 * so the worst case is "solid too early", never "invisible".
 *
 * The hero is pulled up under the masthead rather than the masthead being taken
 * out of flow — a fixed bar would force every other page to compensate for it.
 */
.tyb-home .tyb-hero { margin-top: calc(var(--tyb-header-h) * -1); }
.tyb-home .tyb-hero__inner { padding-top: var(--tyb-header-h); }

.tyb-home .tyb-header__bar {
	background: rgba(255, 255, 255, var(--tyb-shrink));
	border-bottom-color: rgba(228, 222, 210, var(--tyb-shrink));
}

/* The light state: only while over the photograph. */
.tyb-home .tyb-header:not(.is-solid) .tyb-nav__list > li > a,
.tyb-home .tyb-header:not(.is-solid) .tyb-nav__toggle,
.tyb-home .tyb-header:not(.is-solid) .tyb-callnow {
	color: #fff;
}

.tyb-home .tyb-header:not(.is-solid) .tyb-burger__box i { background: #fff; }

/* The hover underline is a gold-era gradient; on the photograph it reads as
   mud, so it becomes plain white until the bar arrives. */
.tyb-home .tyb-header:not(.is-solid) .tyb-nav__list > li > a::after { background: #fff; }

.tyb-header .tyb-nav__list > li > a,
.tyb-header .tyb-nav__toggle,
.tyb-header .tyb-callnow { transition: color .28s var(--tyb-ease); }

/* The submenu panel is its own white surface and is never part of the swap. */
.tyb-home .tyb-nav__sub a { color: var(--tyb-body); }

/*
 * The masthead CTA. Solid navy on a navy photograph disappears, so over the
 * hero it is an outlined button and fills in once the bar is there.
 */
.tyb-header__actions .tyb-btn--sm { transition: background .28s var(--tyb-ease), border-color .28s var(--tyb-ease); }

.tyb-home .tyb-header:not(.is-solid) .tyb-header__actions .tyb-btn--sm {
	background: transparent;
	border: 1px solid rgba(255, 255, 255, .75);
	color: #fff;
}

/* The light lockup sits on top of the dark one and fades out as the bar lands. */
.tyb-logo { position: relative; }
.tyb-logo__img--light {
	position: absolute;
	inset-block-start: 0;
	left: 0;
	opacity: 0;
	pointer-events: none;
	transition: opacity .28s var(--tyb-ease);
}
.tyb-home .tyb-header:not(.is-solid) .tyb-logo__img--light { opacity: 1; }

/* No JS: .is-solid is never added and --tyb-shrink never moves, so the masthead
   would sit transparent forever over a hero that has been pulled up under it.
   The document only gains .js once the inline script in header.php runs. */
html:not(.js) .tyb-home .tyb-hero { margin-top: 0; }
html:not(.js) .tyb-home .tyb-hero__inner { padding-top: 0; }
html:not(.js) .tyb-home .tyb-header__bar { background: #fff; }
html:not(.js) .tyb-logo__img--light { display: none; }

.tyb-rent__all { margin: 1.5rem 0 0; }

/* ------------------------------------------------------ search notice -- */

/*
 * Reuses the inquiry modal's veil and panel wholesale — it is the same object,
 * just carrying a message instead of a form. Only the width and the button row
 * differ, so only those are declared.
 */
.tyb-modal__panel--sm { max-width: 34rem; }

.tyb-note__actions {
	display: flex;
	flex-wrap: wrap;
	gap: .75rem;
	margin-top: 1.6rem;
}

.tyb-note__actions .tyb-btn { flex: 1 1 auto; justify-content: center; }

/* ------------------------------------------------------- agent page -- */

/*
 * The facts block. This is what carries the eight agents who have neither a bio
 * nor a review: a direct line, an email and a state licence number, presented
 * as a proper specification rather than as leftovers. A definition list because
 * that is genuinely what it is, which also gives screen readers the pairing.
 */
.tyb-agentfacts {
	display: grid;
	gap: .85rem 2rem;
	margin: 1.75rem 0 0;
	padding: 1.25rem 0 0;
	border-top: 1px solid var(--tyb-line);
}

@media (min-width: 560px) {
	.tyb-agentfacts { grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); }
}

.tyb-agentfacts dt {
	font-size: .66rem;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}

.tyb-agentfacts dd {
	margin: .3rem 0 0;
	font-family: var(--tyb-display);
	font-size: 1.02rem;
	color: var(--tyb-ink);
	/* Licence numbers and long emails must not push the column open. */
	overflow-wrap: anywhere;
}

.tyb-agentfacts a { color: var(--tyb-accent); }
.tyb-agentfacts a:hover { text-decoration: underline; }

.tyb-agent__actions {
	display: flex;
	flex-wrap: wrap;
	gap: .8rem;
	margin-top: 1.9rem;
}

/* The monogram at portrait size, for an agent with no headshot yet. */
.tyb-agentcard__initials--lg {
	border-radius: 8px;
	font-size: clamp(3.5rem, 9vw, 6rem);
	letter-spacing: .04em;
}

/* ------------------------------------------------- review attribution -- */

.tyb-quote__via--google {
	display: inline-flex;
	align-items: center;
	gap: .32em;
}

/* Sized in em so the mark tracks the caption rather than being pinned to a
   pixel size that stops matching the moment the type scale changes. */
.tyb-gmark {
	width: 1em;
	height: 1em;
	flex-shrink: 0;
	/* The optical centre of the G sits slightly above the text baseline. */
	transform: translateY(.04em);
}

.tyb-quote__via--google > span { line-height: 1; }

/* ----------------------------------------------------------- agent cards -- */

/*
 * The team slider's card. Narrower than a property card on purpose — a
 * portrait, a name and a role is the whole job, and fitting more of them in
 * view is what makes fifteen people read as a roster rather than a queue.
 */
.tyb-slider--team .tyb-slider__track { grid-auto-columns: min(62vw, 15rem, 100%); }

@media (min-width: 900px) {
	.tyb-slider--team .tyb-slider__track { grid-auto-columns: calc((100% - 5rem) / 5); }
}

.tyb-agentcard {
	display: flex;
	flex-direction: column;
	height: 100%;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 8px;
	overflow: hidden;
	color: inherit;
	transition: transform .25s var(--tyb-ease), box-shadow .25s var(--tyb-ease), border-color .25s var(--tyb-ease);
}

.tyb-agentcard:hover {
	transform: translateY(-4px);
	border-color: var(--tyb-brand-lt);
	box-shadow: var(--tyb-shadow);
}

.tyb-agentcard__photo { position: relative; background: var(--tyb-sky); }

/* The monogram, for anyone whose headshot has not arrived. */
.tyb-agentcard__initials {
	display: flex;
	align-items: center;
	justify-content: center;
	aspect-ratio: 1 / 1;
	font-family: var(--tyb-display);
	font-size: 2.4rem;
	color: var(--tyb-brand);
	background: var(--tyb-sky);
}

.tyb-agentcard__body { padding: .95rem 1rem 1.15rem; }

.tyb-agentcard__name {
	display: block;
	font-family: var(--tyb-display);
	font-size: 1.12rem;
	line-height: 1.2;
	color: var(--tyb-ink);
}

.tyb-agentcard__role {
	display: block;
	margin-top: .3rem;
	font-size: .68rem;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}

.tyb-agentcard:hover .tyb-agentcard__name { color: var(--tyb-accent); }

/* --------------------------------------------------------------- filters -- */

.tyb-filters {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem;
	margin-bottom: 2rem;
	padding-bottom: 1.5rem;
	border-bottom: 1px solid var(--tyb-line);
}

.tyb-filter {
	display: inline-flex;
	align-items: center;
	gap: .45rem;
	padding: .5rem .9rem;
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 999px;
	color: var(--tyb-body);
	font-family: var(--tyb-display);
	font-size: .78rem;
	font-weight: 400;
	transition: background .2s var(--tyb-ease), border-color .2s var(--tyb-ease), color .2s var(--tyb-ease);
}
.tyb-filter:hover { border-color: var(--tyb-deep); color: var(--tyb-deep); }

.tyb-filter.is-on {
	background: var(--tyb-deep);
	border-color: var(--tyb-deep);
	color: #fff;
}

.tyb-filter__n {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 1.35rem;
	height: 1.35rem;
	padding-inline: .3rem;
	border-radius: 999px;
	background: var(--tyb-tint-2);
	color: var(--tyb-muted);
	font-size: .68rem;
}
.tyb-filter.is-on .tyb-filter__n { background: rgba(255, 255, 255, .18); color: #fff; }

/* --------------------------------------------------------------- headshot -- */

/* Her headshot is square, so it gets a square frame. It was being forced into a
   3/4 portrait, which cropped it and blew it up far larger than the section
   needed. Capped so it sits beside the text rather than dominating it. */
.tyb-figure--square { aspect-ratio: 1 / 1; }

.tyb-split__media--headshot { max-width: 26rem; margin-inline: auto; }

/* A placeholder that fills whatever frame it lands in — the card, the slider,
   the single-property hero — rather than collapsing to its min-height. */
.tyb-figure--empty.tyb-figure--wide,
.tyb-figure--empty.tyb-figure--hero,
.tyb-figure--empty.tyb-figure--square { min-height: 0; }

.tyb-listing__repd {
	margin: 0 0 .4rem;
	font-family: var(--tyb-display);
	font-size: .74rem;
	font-weight: 400;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}

/* ------------------------------------------------------- hero phone, card -- */

.tyb-hero__phone {
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	margin-top: 1.35rem;
	font-family: var(--tyb-display);
	font-size: 1.15rem;
	font-weight: 400;
	color: #fff;
}
.tyb-hero__phone .tyb-icon { color: var(--tyb-accent-lt); }
.tyb-hero__phone:hover { color: var(--tyb-accent-lt); }
.tyb-hero__phone + .tyb-hero__note { margin-top: .5rem; }

/* The representation line is the reason a sold listing is worth showing. */
.tyb-card__repd {
	margin-bottom: .5rem;
	font-family: var(--tyb-display);
	font-size: .68rem;
	font-weight: 400;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}

/* ------------------------------------------------------- mobile call button -- */

/* Desktop already carries the number in the utility bar, so this is the phone's
   home only on the sizes where that bar is hidden. */
.tyb-callnow { display: none; }

@media (max-width: 1040px) {
	.tyb-callnow {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		gap: .45rem;
		white-space: nowrap;
		/* Flat fill, not the metal gradient the other gold buttons use. That
		   gradient runs dark at the corners and bright through the middle, which
		   is fine across a 200px button and reads as a smudge across a 43px one. */
		background: var(--tyb-accent-lt);
		background-image: none;
		border-color: var(--tyb-accent-lt);
		color: var(--tyb-deep);
		/* A real touch target. It was 43x39 — under the 44px minimum and visibly
		   squatter than the burger sitting next to it. */
		min-height: 44px;
		min-width: 44px;
		padding: .6rem 1rem;
		border-radius: 6px;
	}

	.tyb-callnow:hover {
		background: var(--tyb-accent-mid);
		background-image: none;
		border-color: var(--tyb-accent-mid);
		color: var(--tyb-deep);
		box-shadow: none;
	}

	/* The brand navy, so it picks up the logo sitting beside it. */
	.tyb-callnow .tyb-icon { color: var(--tyb-deep); width: 17px; height: 17px; }
}

/* Below this the words go and the icon carries it — at 380px a labeled button
   plus a burger leaves the logo nowhere to sit. */
@media (max-width: 400px) {
	/* Icon only, and square — a squashed rectangle with a glyph floating in it
	   is what made this look broken. */
	.tyb-callnow span { display: none; }
	.tyb-callnow { padding: 0; width: 44px; height: 44px; }
}

.tyb-hero__phone strong { color: var(--tyb-accent-lt); font-weight: 700; white-space: nowrap; }

@media (max-width: 520px) {
	.tyb-hero__phone { font-size: 1.02rem; align-items: flex-start; }
	.tyb-hero__phone .tyb-icon { margin-top: .3rem; }
}

/* ------------------------------------------------------------ team roster -- */

/* Six members, so a grid rather than six full-width rows. The broker keeps the
   wide treatment because she is the reason to choose the brokerage. */
@media (min-width: 860px) {
	.tyb-team { grid-template-columns: 1fr 1fr; }
	.tyb-team .tyb-member:first-child { grid-column: 1 / -1; }
	.tyb-team .tyb-member:not(:first-child) { grid-template-columns: minmax(0, 12rem) minmax(0, 1fr); }

	/* A two-person brokerage. :nth-child(2):last-child matches only when the
	   second member is also the final one, so a roster of two gets two full
	   cards instead of one wide card and one stranded half beside a hole. Three
	   or more still pair up as before. */
	.tyb-team .tyb-member:nth-child(2):last-child {
		grid-column: 1 / -1;
		grid-template-columns: minmax(0, 18rem) minmax(0, 1fr);
	}
}

.tyb-member__license {
	margin: .75rem 0 0;
	font-family: var(--tyb-display);
	font-size: .7rem;
	font-weight: 400;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tyb-faint);
}

/* A card with no bio should sit tight rather than leave the gap the bio left. */
.tyb-member__bio:empty { display: none; }

/* A heading section immediately above another section doubles its vertical
   padding, which reads as a missing block rather than as breathing room. */
.tyb-section--flush { padding-bottom: 0; }
.tyb-head--tight { margin-bottom: 0; }

/* ------------------------------------------------------- listing address plate --
   Stands in for the listing photo. See tyb_listing_media() for why most synced
   listings arrive without one. It has to read as a designed panel, because on
   this site it is the common case. */
.tyb-plate {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: .85rem;
	padding: 2rem 1.5rem;
	text-align: center;
	background:
		repeating-linear-gradient(135deg, transparent 0 14px, rgba(255, 255, 255, .022) 14px 28px),
		linear-gradient(160deg, #1A1C20 0%, var(--tyb-deep) 55%, #131518 100%);
}

.tyb-plate__addr {
	font-family: var(--tyb-display);
	font-size: clamp(1.05rem, 1.9vw, 1.45rem);
	font-weight: 400;
	line-height: 1.25;
	color: #fff;
	text-wrap: balance;
}

.tyb-plate__rule {
	width: 42px;
	height: 2px;
	background: var(--tyb-accent);
}

.tyb-plate__city {
	font-family: var(--tyb-display);
	font-size: .72rem;
	font-weight: 400;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, .62);
}

/* The hero on a single listing is far taller than a card, so it needs room. */
.tyb-figure--hero.tyb-plate { min-height: clamp(15rem, 34vw, 26rem); }

.tyb-foot__blurb--sm { font-size: .82rem; }

/* ------------------------------------------------------------ hero search --
   This brokerage is on the IDX plan, so the search sits inside the hero. It has
   to stay legible over a photograph, which the page variant never has to do:
   the panel is translucent-dark rather than white, and the labels invert. */
.tyb-hero__search { margin: 1.75rem 0 1.25rem; max-width: 62rem; }

/*
 * The hero search panel: light frosted glass over the photograph.
 *
 * It was a 62% warm-charcoal veil carried over from the previous client, which
 * on a blue-green aerial read as a dirty smudge. This is the opposite — a light
 * material that lifts the photograph rather than covering it.
 *
 * Two things make it read as glass rather than as a flat white box: a real blur
 * doing the work at low opacity, and `saturate()`, which keeps the water and
 * the greenery showing through in colour instead of going milky grey. The inner
 * hairline is the classic glass edge — a light top rim catching the light.
 *
 * The panel is light, so the labels flip to ink. That is the whole reason the
 * old rules cannot simply have their alpha lowered: white-on-light would fail.
 */
.tyb-search--hero {
	background: rgba(255, 255, 255, .52);
	border-color: rgba(255, 255, 255, .65);
	box-shadow:
		0 18px 44px rgba(16, 17, 19, .28),
		inset 0 1px 0 rgba(255, 255, 255, .55);
	backdrop-filter: blur(22px) saturate(1.5);
	-webkit-backdrop-filter: blur(22px) saturate(1.5);
}

.tyb-search--hero .tyb-search__field label { color: var(--tyb-ink); }

/*
 * The fields stay solidly white so they still read as things you type into —
 * on a translucent panel an equally translucent input disappears into it. The
 * hairline border is what separates white-on-light; without it the fields merge
 * into the glass.
 */
.tyb-search--hero .tyb-search__field input,
.tyb-search--hero .tyb-search__field select {
	background: #fff;
	border-color: rgba(16, 17, 19, .14);
}

.tyb-search--hero .tyb-search__field input::placeholder { color: var(--tyb-faint); }

.tyb-search--hero .tyb-search__more summary { color: var(--tyb-body); }
.tyb-search--hero .tyb-search__more summary:hover { color: var(--tyb-accent); }

/*
 * Safari on iOS honours backdrop-filter; a browser that does not would render a
 * 52%-white box with no blur, which is legible but flat. Give those a more
 * opaque panel so the type never sits on a half-transparent ground.
 */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	.tyb-search--hero { background: rgba(255, 255, 255, .88); }
}

/* The disclosure and the result line. */
.tyb-search__more { margin-top: .8rem; }

.tyb-search__more summary {
	font-family: var(--tyb-display);
	font-size: .72rem;
	font-weight: 400;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tyb-muted);
	cursor: pointer;
}

.tyb-search__row--more {
	grid-template-columns: repeat(3, 1fr);
	margin-top: .75rem;
}
@media (max-width: 900px) { .tyb-search__row--more { grid-template-columns: 1fr 1fr; } }

.tyb-search__result {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .75rem;
	margin: 1rem 0 0;
	font-size: .95rem;
	color: var(--tyb-body);
}

.tyb-search__clear {
	font-family: var(--tyb-display);
	font-size: .72rem;
	font-weight: 400;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tyb-accent);
}

/* ============================================================= markets === */

/*
 * The market grid.
 *
 * Each card is an area's own boundary, drawn from OpenStreetMap geometry —
 * see TYN_Areas. The shape is the picture, so it gets the space a photograph
 * would and the caption sits under it rather than over it.
 *
 * Cards whose outline has not been cached yet carry .tyb-market--noshape and
 * simply centre their caption. That has to look deliberate, because on a cold
 * cache it is what every card looks like.
 */

.tyb-markets__grid {
	list-style: none;
	margin: 2.5rem 0 0;
	padding: 0;
	display: grid;
	gap: 1rem;
	grid-template-columns: repeat(var(--tyb-cols, 4), 1fr);
}

@media (max-width: 1040px) { .tyb-markets__grid { grid-template-columns: repeat(var(--tyb-cols-md, 3), 1fr); } }
@media (max-width: 780px)  { .tyb-markets__grid { grid-template-columns: repeat(var(--tyb-cols-sm, 2), 1fr); gap: .75rem; } }

.tyb-market__link {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: .3rem;
	height: 100%;
	padding: 1.5rem 1rem 1.25rem;
	/* White, not the cream ground — a cream card on a cream page has no edge. */
	background: var(--tyb-white);
	border: 1px solid var(--tyb-line);
	border-radius: 14px;
	text-align: center;
	text-decoration: none;
	transition: border-color .22s var(--tyb-ease), transform .22s var(--tyb-ease), box-shadow .22s var(--tyb-ease);
}

.tyb-market__link:hover {
	border-color: var(--tyb-accent);
	transform: translateY(-3px);
	box-shadow: 0 16px 34px -20px rgba(16, 10, 12, .4);
}

.tyb-market__shape {
	display: block;
	width: 96px; height: 96px;
	margin-bottom: .55rem;
}

/* The silhouette itself. Filled rather than stroked: at this size a 1px
   outline of a municipal boundary is a grey haze, and a solid shape reads as
   a place. */
.tyb-market__shape .tyb-shape { width: 100%; height: 100%; display: block; }
.tyb-market__shape .tyb-shape path {
	fill: var(--tyb-accent);
	opacity: .16;
	transition: opacity .22s var(--tyb-ease);
}
.tyb-market__link:hover .tyb-shape path { opacity: .34; }

.tyb-market__name {
	font-family: var(--tyb-display);
	font-size: 1.2rem;
	line-height: 1.15;
	color: var(--tyb-ink);
}

.tyb-market__note {
	color: var(--tyb-muted);
	font-size: .82rem;
	line-height: 1.45;
}

.tyb-market__cta {
	margin-top: .55rem;
	font-size: .7rem;
	font-weight: 600;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tyb-accent);
	opacity: 0;
	transform: translateY(3px);
	transition: opacity .22s var(--tyb-ease), transform .22s var(--tyb-ease);
}
.tyb-market__link:hover .tyb-market__cta,
.tyb-market__link:focus-visible .tyb-market__cta { opacity: 1; transform: none; }

/* Keep the caption vertically centred when there is no shape to sit under. */
.tyb-market--noshape .tyb-market__link { justify-content: center; padding-block: 2.25rem; }

/* ================================================================ pair === */

.tyb-pair__photo {
	margin: 2.5rem auto 0;
	max-width: 900px;
	border-radius: 16px;
	overflow: hidden;
	box-shadow: 0 26px 60px -34px rgba(16, 10, 12, .55);
}
.tyb-pair__photo img { display: block; width: 100%; height: auto; }

.tyb-pair__grid {
	margin-top: 2.25rem;
	display: grid;
	gap: 2rem;
	grid-template-columns: repeat(2, 1fr);
	max-width: 900px;
	margin-inline: auto;
}
@media (max-width: 780px) { .tyb-pair__grid { grid-template-columns: 1fr; gap: 1.75rem; } }

.tyb-pair__name { margin: 0 0 .15rem; font-family: var(--tyb-display); font-size: 1.5rem; color: var(--tyb-ink); }
.tyb-pair__role {
	margin: 0 0 .7rem;
	font-size: .72rem; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
	color: var(--tyb-accent);
}
.tyb-pair__bio  { margin: 0 0 .9rem; color: var(--tyb-body); font-size: .95rem; }
.tyb-pair__more {
	font-size: .82rem; font-weight: 600; color: var(--tyb-accent); text-decoration: none;
}
.tyb-pair__more:hover { text-decoration: underline; }

/* ================================================== mobile header controls ==
 *
 * The call button and the menu button sit next to each other and were built at
 * different times, which showed: 44px tall with a 6px radius and a flat red
 * fill against roughly 38px with a 4px radius and a hairline border. Two
 * controls a thumb-width apart have to look like one set of controls, or the
 * masthead reads as unfinished before a word of the site is read.
 *
 * So the burger is now the same 44px square with the same radius, and it takes
 * the hero omnibar's glass — blur plus a desaturating filter, which is what
 * keeps the surface neutral over whatever photograph is behind it rather than
 * picking up its colour. The call button stays solid: these should be the same
 * SIZE, not the same weight. Calling is the thing worth doing, and the button
 * that does it should be the one with the fill.
 */

.tyb-burger {
	width: 44px;
	height: 44px;
	padding: 0;
	display: none;
	place-items: center;
	border-radius: 6px;
	border: 1px solid rgba(16, 17, 19, .12);
	background: rgba(255, 255, 255, .55);
	-webkit-backdrop-filter: blur(18px) saturate(.6);
	backdrop-filter: blur(18px) saturate(.6);
	box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7);
	transition: background .25s var(--tyb-ease), border-color .25s var(--tyb-ease),
	            transform .18s var(--tyb-ease);
}

@media (max-width: 1040px) { .tyb-burger { display: grid; } }

/* A press that answers. Nothing else in the masthead moves on tap. */
.tyb-burger:active { transform: scale(.94); }

.tyb-burger__box { width: 18px; }
.tyb-burger__box i { height: 1.5px; border-radius: 1px; }
.tyb-burger__box i + i { margin-top: 4.5px; }

/*
 * Over the home hero the header is transparent and the backdrop is a dark
 * photograph, so a white glass would be a bright chip on a dark scene and the
 * white bars inside it would disappear. Same material, inverted: a dark tint
 * with a white hairline, which reads as frosted rather than as a hole.
 */
.tyb-home .tyb-header:not(.is-solid) .tyb-burger {
	background: rgba(255, 255, 255, .14);
	border-color: rgba(255, 255, 255, .34);
	box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22);
}

/* Browsers without backdrop-filter get a solid chip instead of a see-through
   one — legible either way, which is the only requirement. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	.tyb-burger { background: rgba(255, 255, 255, .92); }
	.tyb-home .tyb-header:not(.is-solid) .tyb-burger { background: rgba(16, 17, 19, .42); }
}

/* Someone who has asked for less motion: the burger changes state at once. */
@media (prefers-reduced-motion: reduce) {
	.tyb-burger { transition-duration: .01ms; }
}


/* ============================================== the shore rule, repeated ==
 *
 * One motif carries the whole palette: a four-part bar under every section
 * heading, running the coast from the water to the dune — Atlantic teal, surf
 * aqua, sunset coral, sea-grass.
 *
 * This is the difference between a colourful site and a site that could not
 * pick a colour. Five hues scattered across five unrelated components reads as
 * indecision; the same five in one shape, repeated on every heading, reads as
 * a brand. Yessenia Storing's pine / sandstone / red heading rule is the same
 * idea, and themes/CLAUDE.md trap 12 is the rule that produced it: the lockup
 * gets a short two-tone rule carrying the brand colours, never a monogram.
 *
 * The colours in it are FILLS. Aqua at 2.4:1 and sea-grass at 2.8:1 could not
 * carry a word, and in a 3px bar they never have to.
 */
.tyb-rule {
	/* Four stops, hard-edged, no blending — gradients between these hues go
	   muddy through the teal/coral midpoint. Widened to 72px so four bands are
	   each still legible rather than four slivers. */
	width: 72px;
	background: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%);
	box-shadow: inset 0 0 0 1px rgba(16, 17, 19, .07);
}

/*
 * Coral is the call to action, teal is the furniture.
 *
 * The gradient here was three hardcoded hexes of flag red (#8E1B29 / #C6293C /
 * #B22234) left over from the theme this was copied from. Swapping the :root
 * tokens did not touch them and a grep for the old client's NAME did not find
 * them either — this is trap 16 exactly, and it survived until the rendered
 * page was sampled pixel by pixel and the button came back #AF363F on a site
 * with no crimson in its palette.
 *
 * Sunset coral is 4.1:1 on the cream ground: right for a button, and it is the
 * only warm thing on a mostly teal-and-sand page, so it is unmistakably the
 * thing to press.
 */
.tyb-btn--accent {
	background: linear-gradient(135deg, var(--tyb-coral-dk) 0%, var(--tyb-coral-br) 58%, var(--tyb-coral) 100%);
	border-color: transparent;
	color: #fff;
}
.tyb-btn--accent:hover {
	background: linear-gradient(135deg, var(--tyb-coral-dk) 0%, var(--tyb-coral-br) 58%, var(--tyb-coral) 100%);
	filter: brightness(1.07);
	border-color: transparent;
	color: #fff;
	box-shadow: 0 12px 26px -12px rgba(194, 83, 26, .55);
}

/* The same four-part shore rule the hero closes on, above the footer — so the
   page opens and closes on the same motif that sits under every heading. */
.tyb-foot::after {
	content: '';
	position: absolute;
	top: 0; left: 0; right: 0;
	height: 5px;
	z-index: 2;
	background: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%);
}

/* The stat band gets the full shore rule as its top edge, so the credentials
   strip reads as a ribbon rather than a grey band. */
.tyb-creds { border-top: 3px solid transparent; border-image: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%) 1; }

/* Eyebrows run teal, not coral. Coral is reserved for the thing to press —
   spending it on every section label is what makes an accent stop working. */
.tyb-eyebrow:not(.tyb-eyebrow--light) { color: var(--tyb-brand); }

.tyb-nav__list > li > a::after { background: var(--tyb-coral); }

/* The hero closes on the shore rule, full width — the same four colours in the
   same order as the bar under every heading and in the favicon. */
.tyb-hero::after {
	content: '';
	position: absolute;
	left: 0; right: 0; bottom: 0;
	height: 5px;
	z-index: 3;
	background: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%);
}

/* One red button state, on the primary call to action only. */
.tyb-btn--accent:hover {
	background: var(--tyb-red);
	border-color: var(--tyb-red);
	color: #fff;
}

/* The portrait frame follows the photograph rather than imposing a square on
   it — his headshot is 4:5 and a square crop takes off his hair and his arms. */
.tyb-split__media--portrait { max-width: 24rem; margin-inline: auto; }

.tyb-figure--portrait { aspect-ratio: auto; }

.tyb-figure--portrait img {
	display: block;
	width: 100%;
	height: auto;
	object-fit: contain;
	border-radius: 12px;
}

@media (max-width: 900px) {
	.tyb-split__media--portrait { max-width: 19rem; }
}

/* The brokerage mark in the footer. White artwork on the near-black ground it
   was recoloured for; capped so it sits under his own name rather than beside
   it, which is the way the relationship actually reads. */
.tyb-foot__firmmark {
	display: block;
	width: auto;
	max-width: 220px;
	height: auto;
	margin-top: 1.5rem;
	opacity: .92;
}

@media (max-width: 560px) { .tyb-foot__firmmark { max-width: 180px; } }


/* ================================================ the hero video loop ==
 *
 * The poster is a real <img> so it paints with the page; the video fades in
 * over it only once it can actually play, or the fade shows a black box while
 * the first frames arrive.
 */
.tyb-hero__poster,
.tyb-hero__video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 55%;
}

.tyb-hero__video {
	opacity: 0;
	transition: opacity .9s var(--tyb-ease);
	pointer-events: none;
}

.tyb-hero__video.is-ready { opacity: 1; }

/*
 * At 900px and under the <picture> swaps in hero-mobile.jpg, a 3:4 crop with
 * the flag right of centre. A phone shows about two-thirds of its width, so it
 * is pulled right to keep the flag and the porch; a tablet shows the full width
 * and loses height instead, so it is pulled up to keep the top of the flag.
 */
@media (max-width: 900px) {
	.tyb-hero__poster { object-position: 60% 30%; }
}

/* ==================================================== the floating call ==
 *
 * Red, white and blue rather than a single brand colour: a white pill with a
 * navy label, an Old Glory red icon plate, and the three-part band along the
 * bottom edge that the hero and the footer also carry. White is the ground
 * because the pill sits over photographs and a navy pill on a navy-scrimmed
 * hero disappears.
 */
.tyb-callbar {
	position: fixed;
	right: clamp(.9rem, 2vw, 1.5rem);
	bottom: clamp(.9rem, 2vw, 1.5rem);
	z-index: 80;
}

.tyb-callbar__call {
	position: relative;
	display: inline-flex;
	align-items: center;
	gap: .7rem;
	padding: .7rem 1.15rem .8rem .7rem;
	background: #fff;
	border-radius: 999px;
	box-shadow: 0 14px 34px -12px rgba(16, 17, 19, .55), 0 2px 6px rgba(16, 17, 19, .16);
	text-decoration: none;
	overflow: hidden;
	transition: transform .22s var(--tyb-ease), box-shadow .22s var(--tyb-ease);
}
.tyb-callbar__call:hover { transform: translateY(-2px); box-shadow: 0 18px 40px -12px rgba(16, 17, 19, .6); }

/* The flag band, along the bottom edge of the pill. */
.tyb-callbar__call::after {
	content: '';
	position: absolute;
	left: 0; right: 0; bottom: 0;
	height: 3px;
	background: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%);
}

.tyb-callbar__ico {
	display: grid;
	place-items: center;
	width: 2.35rem;
	height: 2.35rem;
	flex: 0 0 auto;
	border-radius: 50%;
	background: var(--tyb-red);
	color: #fff;
}
.tyb-callbar__ico svg { width: 17px; height: 17px; }

.tyb-callbar__txt { display: flex; flex-direction: column; line-height: 1.15; }
.tyb-callbar__txt strong {
	font-family: var(--tyb-display);
	font-size: .95rem;
	font-weight: 400;
	color: var(--tyb-brand);
}
.tyb-callbar__txt em {
	font-style: normal;
	font-size: .82rem;
	font-weight: 600;
	color: var(--tyb-red);
	letter-spacing: .01em;
}

/* ================================================ mobile: logo and hero ==
 *
 * The lockup is stacked, so the same height that reads well on a desktop bar
 * swallows a phone masthead.
 */
@media (max-width: 720px) {
	/*
	 * The masthead overflowed: measured at a 500px viewport the burger's right
	 * edge sat at 521px, so scrollWidth beat clientWidth by 21px and the button
	 * was partly off-screen. Logo 290 + actions 187 does not fit in 500.
	 *
	 * The header's Call Now is what goes. The floating pill carries the number
	 * on every screen and is closer to the thumb, so a second call control in
	 * the masthead was buying nothing and costing the burger its place.
	 */
	.tyb-header__actions .tyb-callnow { display: none; }
	.tyb-header__inner { gap: .75rem; }

	/*
	 * Size the logo through the tokens, not with height:auto.
	 *
	 * The height is a calc that interpolates on --tyb-shrink, which is what
	 * makes the masthead shrink as you scroll. Overriding it with height:auto
	 * — which an earlier pass here did — pins the logo at one size and quietly
	 * removes the shrink on phones, where the bar can least afford the room.
	 * max-width stays only as a guard against a very wide lockup.
	 */
	:root { --tyb-logo-max: 44px; --tyb-logo-min: 30px; }
	.tyb-logo--header .tyb-logo__img { max-width: 52vw; }
}


/* ================================================ no dark bands anywhere ==
 *
 * Adam asked for dark, was shown dark, rejected it — and then rejected
 * light-with-dark-bands as still too dark (memory: feedback_dark_themes_too_dark).
 * The settled answer for this lineage is FULLY light, so the one remaining
 * near-black band on the page is converted here rather than by editing the
 * template that asks for it. Keeping the `--dark` class name means the
 * markup and every sibling theme still read the same; only what it means
 * changed.
 *
 * It still has to be a BAND — a page of unbroken cream has no rhythm. So it
 * becomes the most saturated light thing on the site: a pale-aqua-to-sand
 * wash, edged top and bottom with the shore rule, carrying ink type.
 */
.tyb-section--dark {
	background: linear-gradient(168deg, var(--tyb-surf-pale) 0%, var(--tyb-shell) 46%, var(--tyb-sand) 100%);
	color: var(--tyb-body);
	position: relative;
}
.tyb-section--dark::before,
.tyb-section--dark::after {
	content: '';
	position: absolute;
	left: 0; right: 0;
	height: 4px;
	background: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%);
}
.tyb-section--dark::before { top: 0; }
.tyb-section--dark::after  { bottom: 0; }

.tyb-section--dark h1,
.tyb-section--dark h2,
.tyb-section--dark h3 { color: var(--tyb-ink); }

/* The creed sat white-on-near-black. Same hierarchy, inverted. */
.tyb-creed__goal   { color: var(--tyb-ink); }
.tyb-creed__close  { color: var(--tyb-brand); font-weight: 600; }
.tyb-creed__attrib { color: var(--tyb-muted); }
.tyb-creed__call   { color: var(--tyb-body); }
.tyb-creed__call strong,
.tyb-creed__call .tyb-icon { color: var(--tyb-brand); }
.tyb-creed__call:hover { color: var(--tyb-ink); }

/* ======================================= the town grid carries the thesis ==
 *
 * The whole site argues that Cape May County is two markets. The eight-town
 * grid is where that is easiest to SHOW rather than state: the first four are
 * barrier islands and the last four are the mainland behind them, so the
 * islands are washed in surf aqua and the mainland in sand. Read the grid
 * and the split explains itself before the copy does.
 *
 * It also fixes a real flatness problem. These cards were white on cream with
 * a hairline border and a faint map outline, and on a page sold on its colour
 * they were the largest and dullest block in it.
 *
 * The wash is a tint behind the card, never behind the text: the name and note
 * keep ink and body colours at full contrast on a ground no darker than 8%.
 */
.tyb-market--a .tyb-market__link {
	background: linear-gradient(180deg, #FFFFFF 0%, var(--tyb-surf-pale) 100%);
	border-color: #D3D4D5;
}
.tyb-market--b .tyb-market__link {
	background: linear-gradient(180deg, #FFFFFF 0%, #F9EEE8 100%);
	border-color: #F0D4C6;
}

/* A colour chip on the top edge of every card — aqua for an island, sand-deep
   for the mainland — so the grouping survives at phone width where the cards
   stack into a single column and the two-by-four reading is lost. */
.tyb-market__link { position: relative; overflow: hidden; }
.tyb-market__link::before {
	content: '';
	position: absolute;
	top: 0; left: 0; right: 0;
	height: 3px;
}
.tyb-market--a .tyb-market__link::before { background: var(--tyb-surf); }
.tyb-market--b  .tyb-market__link::before { background: var(--tyb-sand-dp); }

.tyb-market--a .tyb-market__link:hover { border-color: var(--tyb-surf-dk); }
.tyb-market--b  .tyb-market__link:hover { border-color: var(--tyb-dune-dk); }

/* The map outline was a pale grey wash that read as a smudge on three cards
   and was invisible on the five whose boundary never resolved. Give it the
   band's own colour so it reads as intentional artwork either way. */
.tyb-market--a .tyb-market__shape svg * { fill: var(--tyb-surf); opacity: .5; }
.tyb-market--b  .tyb-market__shape svg * { fill: var(--tyb-sand-dp); opacity: .62; }

/* ------------------------------------------------- the closer, also light --
 *
 * Same call as .tyb-section--dark above: this was a near-black block sitting
 * directly on top of an already-dark footer, which stacked into roughly a
 * third of the page being dark on a site briefed as fully light. It keeps its
 * weight by being the most saturated light band instead — teal-tinted, edged
 * with the shore rule — so the eye still stops on it.
 */
.tyb-closer {
	background: linear-gradient(168deg, var(--tyb-surf-pale) 0%, var(--tyb-shell) 52%, var(--tyb-sand) 100%);
	color: var(--tyb-body);
	border-top: 4px solid transparent;
	border-image: linear-gradient(90deg,
		var(--tyb-brand) 0%,   var(--tyb-brand) 25%,
		var(--tyb-surf)  25%,  var(--tyb-surf)  50%,
		var(--tyb-coral) 50%,  var(--tyb-coral) 75%,
		var(--tyb-dune)  75%,  var(--tyb-dune)  100%) 1;
}
.tyb-closer::before {
	background: radial-gradient(circle, rgba(197, 206, 219, .16) 0%, transparent 62%);
}
.tyb-closer__title { color: var(--tyb-ink); }
.tyb-closer__lede  { color: var(--tyb-body); }
/* The eyebrow was teal-on-near-black and all but invisible. */
.tyb-closer .tyb-eyebrow { color: var(--tyb-brand); }

/* --------------------------------------------------- footer contrast fixes --
 *
 * scripts/contrast-audit.js checked 48 elements on the home page and failed
 * three, all in the footer and all marginal: the two column headings at
 * 4.27:1 and the phone number at 4.32:1, against 4.5:1 required. Marginal is
 * still failing, and these are small text on a dark ground, which is the
 * combination people actually struggle with.
 */
.tyb-foot__h { color: rgba(255, 255, 255, .62); }
.tyb-foot em { color: rgba(255, 255, 255, .72); font-style: normal; }

/* The floating call pill's number sat on --tyb-coral, which is 4.32:1 on the
   pill's white ground — right for a button fill, wrong for 13px text. The
   darker coral is 5.2:1 and is visually the same colour at this size. */
.tyb-callbar__txt em { color: var(--tyb-coral-dk); }

/* The closer's secondary button was .tyb-btn--ghost-light: a white outline
   with white type, drawn for the near-black band this section used to be. On
   the light band it is now, it was a pale ghost on cream — present, rendered,
   effectively invisible. Same class of mistake as trap 4. Inside the closer it
   becomes a teal outline instead. */
.tyb-closer .tyb-btn--ghost-light {
	border-color: var(--tyb-brand);
	color: var(--tyb-brand);
}
.tyb-closer .tyb-btn--ghost-light:hover {
	background: var(--tyb-brand);
	border-color: var(--tyb-brand);
	color: #fff;
}

/* "1 Atlantic Avenue, Ocean / City, NJ 08226" — the footer column is narrow
   enough to break the town in half. Keep the city-state-zip together. */
.tyb-foot__addr { text-wrap: balance; }

/* The licence line under an agent's name was --tyb-faint, which is 2.7:1 on
   the card — fine as a decorative grey, and this is not decorative. California
   (and most states) require the number to be legible in advertising. */
.tyb-member__license { color: var(--tyb-muted); }

/* === upgrade-lineage: frames and figures === */
/*
 * Added by scripts/upgrade-lineage.py. See that file for why each exists.
 */

/* A transparent GROUP cutout: wide, anchored to the bottom of a soft brand
   panel, never cropped. */
.tyb-split__media--team { max-width: none; width: 100%; }
.tyb-figure--team {
	aspect-ratio: auto;
	margin: 0;
	padding: 1.5rem 1rem 0;
	border-radius: 16px;
	background: linear-gradient(180deg, var(--tyb-shell) 0%, var(--tyb-tint-2) 100%);
	overflow: hidden;
	position: relative;
}
.tyb-figure--team img {
	display: block; width: 100%; height: auto;
	object-fit: contain; object-position: center bottom;
}

/* NO HEADSHOT: a photograph of the market in the agent's slot. Cropped to a
   calm landscape, because it is a place and cropping a place costs nothing —
   the opposite rule from a face. */
.tyb-split__media--scene { max-width: none; width: 100%; }
.tyb-figure--scene {
	aspect-ratio: 4 / 3;
	margin: 0;
	border-radius: 16px;
	overflow: hidden;
	box-shadow: var(--tyb-shadow-lg);
}
.tyb-figure--scene img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Figures set large; word labels untouched. */
.tyb-creds__label--num {
	font-size: clamp(2.1rem, 1.5rem + 2.2vw, 3.1rem);
	line-height: 1;
	letter-spacing: -.01em;
	color: var(--tyb-brand);
}
.tyb-creds__label--num + .tyb-creds__note {
	margin-top: .55rem;
	font-size: .78rem;
	letter-spacing: .12em;
	text-transform: uppercase;
	font-weight: 600;
}

/* A small SQUARE headshot (homes.com serves 300x300): centred and capped so it
   is never enlarged past its source, instead of cropped into a portrait frame
   that loses the sides of the face. 'shape' => 'square' in team(). */
.tyb-split__media--square { max-width: 22rem; margin-inline: auto; }
.tyb-split__media--square .tyb-figure--square { border-radius: 16px; overflow: hidden; }
@media (max-width: 720px) { .tyb-split__media--square { max-width: 17rem; } }

/* === install-features: feature sections === */
/*
 * Added by scripts/install-features.py. Tones use the theme's four roles, so
 * each site's sections come out in its own palette.
 */
.tyb-tone--brand { --tone: var(--tyb-brand); --tone-pale: var(--tyb-brand-pale); }
.tyb-tone--coral { --tone: var(--tyb-coral); --tone-pale: var(--tyb-coral-pale); }
.tyb-tone--surf  { --tone: var(--tyb-surf-dk); --tone-pale: var(--tyb-surf-pale); }
.tyb-tone--dune  { --tone: var(--tyb-dune-dk); --tone-pale: var(--tyb-dune-pale); }

.tyb-feat__note { max-width: 44rem; margin: 2.25rem auto 0; text-align: center; color: var(--tyb-muted); font-size: .95rem; }

/* journey: a line that draws, stops that pop in turn */
.tyb-journey { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); gap: 1.25rem; position: relative; }
.tyb-journey::before { content: ""; position: absolute; left: 1.4rem; right: 1.4rem; top: 1.4rem; height: 3px; border-radius: 3px;
	background: linear-gradient(90deg, var(--tyb-brand), var(--tyb-coral), var(--tyb-dune), var(--tyb-surf)); transform-origin: left center; }
.tyb-journey__stop { position: relative; display: flex; flex-direction: column; gap: .4rem; }
.tyb-journey__dot { width: 2.8rem; height: 2.8rem; border-radius: 50%; display: grid; place-items: center; background: var(--tyb-white);
	border: 3px solid var(--tone); color: var(--tone); font-weight: 700; font-size: .85rem; position: relative; z-index: 1; box-shadow: 0 6px 18px -10px var(--tone); }
.tyb-journey__when { font-size: .72rem; letter-spacing: .14em; text-transform: uppercase; color: var(--tone); font-weight: 600; margin-top: .35rem; }
.tyb-journey__label { font-family: var(--tyb-display); font-size: 1.3rem; line-height: 1.15; color: var(--tyb-ink); font-weight: 400; }
.tyb-journey__body { color: var(--tyb-body); font-size: .95rem; line-height: 1.55; }

/* bento: coloured tiles, one big counting number */
.tyb-bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; }
.tyb-bento__tile { position: relative; border-radius: 18px; padding: 1.6rem 1.5rem 1.7rem; background: var(--tone-pale); border: 1px solid color-mix(in srgb, var(--tone) 18%, transparent);
	overflow: hidden; transition: transform .35s var(--tyb-ease), box-shadow .35s var(--tyb-ease); }
.tyb-bento__tile::after { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--tone); }
.tyb-bento__tile:hover { transform: translateY(-4px); box-shadow: var(--tyb-shadow-lg); }
.tyb-bento__tile--wide { grid-column: span 2; }
.tyb-bento__tile--big { background: var(--tone); color: #fff; border-color: transparent; }
.tyb-bento__tile--big::after { display: none; }
.tyb-bento__tile--big .tyb-bento__title, .tyb-bento__tile--big .tyb-bento__body { color: #fff; }
.tyb-bento__big { display: block; font-family: var(--tyb-display); font-size: clamp(3.2rem, 2.4rem + 3vw, 5rem); line-height: .95; margin-bottom: .6rem; font-variant-numeric: tabular-nums; }
.tyb-bento__num { display: block; font-size: .78rem; letter-spacing: .16em; color: var(--tone); font-weight: 700; margin-bottom: .9rem; }
.tyb-bento__title { font-family: var(--tyb-display); font-size: 1.35rem; line-height: 1.15; margin: 0 0 .5rem; color: var(--tyb-ink); font-weight: 400; }
.tyb-bento__body { margin: 0; color: var(--tyb-body); font-size: .95rem; line-height: 1.55; }

/* split: two panels facing each other */
.tyb-splitfeat { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1.25rem; align-items: stretch; }
.tyb-splitfeat__panel { border-radius: 20px; padding: 2rem 1.9rem; background: var(--tone-pale); border-top: 5px solid var(--tone); }
.tyb-splitfeat__eye { font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; font-weight: 700; color: var(--tone); }
.tyb-splitfeat__title { font-family: var(--tyb-display); font-size: clamp(1.6rem, 1.3rem + 1vw, 2.2rem); margin: .35rem 0 .7rem; color: var(--tyb-ink); font-weight: 400; }
.tyb-splitfeat__body { color: var(--tyb-body); margin: 0 0 1rem; }
.tyb-splitfeat__points { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; }
.tyb-splitfeat__points li { position: relative; padding-left: 1.4rem; color: var(--tyb-body); }
.tyb-splitfeat__points li::before { content: ""; position: absolute; left: 0; top: .55em; width: .55rem; height: .55rem; border-radius: 50%; background: var(--tone); }
.tyb-splitfeat__join { align-self: center; width: 3.4rem; height: 3.4rem; border-radius: 50%; display: grid; place-items: center; background: var(--tyb-ink); color: #fff; font-family: var(--tyb-display); font-size: 1.25rem; }

/* timeline: years down a drawn line */
.tyb-timeline { list-style: none; margin: 0 auto; padding: 0; max-width: 46rem; position: relative; }
.tyb-timeline::before { content: ""; position: absolute; left: 6.2rem; top: .4rem; bottom: .4rem; width: 3px; border-radius: 3px;
	background: linear-gradient(180deg, var(--tyb-brand), var(--tyb-coral), var(--tyb-dune), var(--tyb-surf)); transform-origin: top center; }
.tyb-timeline__item { display: grid; grid-template-columns: 5.2rem 1fr; gap: 2.2rem; padding-block: .9rem; position: relative; }
.tyb-timeline__item::before { content: ""; position: absolute; left: 5.85rem; top: 1.45rem; width: .95rem; height: .95rem; border-radius: 50%; background: var(--tyb-white); border: 3px solid var(--tone); }
.tyb-timeline__when { text-align: right; font-family: var(--tyb-display); font-size: 1.6rem; line-height: 1.2; color: var(--tone); }
.tyb-timeline__card strong { display: block; font-family: var(--tyb-display); font-weight: 400; font-size: 1.3rem; color: var(--tyb-ink); margin-bottom: .25rem; }
.tyb-timeline__card p { margin: 0; color: var(--tyb-body); }

@media (max-width: 900px) {
	.tyb-journey { grid-template-columns: 1fr; gap: 1.4rem; padding-left: .2rem; }
	.tyb-journey::before { left: 1.4rem; right: auto; top: 1.4rem; bottom: 1.4rem; width: 3px; height: auto; transform-origin: top center; }
	.tyb-journey__stop { display: grid; grid-template-columns: 2.8rem 1fr; column-gap: 1rem; }
	.tyb-journey__stop > :not(.tyb-journey__dot) { grid-column: 2; }
	.tyb-journey__dot { grid-row: span 3; }
	.tyb-bento { grid-template-columns: 1fr 1fr; }
	.tyb-splitfeat { grid-template-columns: 1fr; }
	.tyb-splitfeat__join { justify-self: center; }
}
@media (max-width: 560px) {
	.tyb-bento { grid-template-columns: 1fr; }
	.tyb-bento__tile--wide { grid-column: auto; }
	.tyb-timeline::before { left: 4.4rem; }
	.tyb-timeline__item { grid-template-columns: 3.6rem 1fr; gap: 1.6rem; }
	.tyb-timeline__item::before { left: 4.05rem; }
	.tyb-timeline__when { font-size: 1.2rem; }
}

@media (prefers-reduced-motion: no-preference) {
	html.js .tyb-journey::before { transform: scaleX(0); transition: transform 1.4s var(--tyb-ease) .15s; }
	html.js .tyb-journey.is-in::before { transform: scaleX(1); }
	html.js .tyb-journey .tyb-journey__stop { opacity: 0; transform: translateY(14px); transition: opacity .6s var(--tyb-ease), transform .6s var(--tyb-ease); transition-delay: calc(.25s + var(--i) * .18s); }
	html.js .tyb-journey.is-in .tyb-journey__stop { opacity: 1; transform: none; }
	html.js .tyb-journey .tyb-journey__dot { transform: scale(.4); transition: transform .5s cubic-bezier(.34, 1.56, .64, 1); transition-delay: calc(.35s + var(--i) * .18s); }
	html.js .tyb-journey.is-in .tyb-journey__dot { transform: none; }
	html.js .tyb-timeline::before { transform: scaleY(0); transition: transform 1.6s var(--tyb-ease) .1s; }
	html.js .tyb-timeline.is-in::before { transform: scaleY(1); }
	html.js .tyb-timeline .tyb-timeline__item { opacity: 0; transform: translateX(18px); transition: opacity .6s var(--tyb-ease), transform .6s var(--tyb-ease); transition-delay: calc(.2s + var(--i) * .2s); }
	html.js .tyb-timeline.is-in .tyb-timeline__item { opacity: 1; transform: none; }
	html.js .tyb-splitfeat__panel[data-tyb-reveal] { transform: translateX(calc((var(--i) * 2 - 1) * 28px)); }
	html.js .tyb-splitfeat__panel[data-tyb-reveal].is-in { transform: none; }
	html.js .tyb-splitfeat__join[data-tyb-reveal] { transform: scale(.3) rotate(-90deg); transition-delay: .35s; }
	html.js .tyb-splitfeat__join[data-tyb-reveal].is-in { transform: none; }
}
@media (max-width: 900px) and (prefers-reduced-motion: no-preference) {
	html.js .tyb-journey::before { transform: scaleY(0); }
	html.js .tyb-journey.is-in::before { transform: scaleY(1); }
}

/* long reviews: the first 46 words, and the rest in place (never cut off) */
.tyb-quote__more { margin-top: .75rem; background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; font-weight: 600; color: var(--tyb-brand); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.tyb-quote__full[hidden] { display: none; }

/* Four tiles sit 2 x 2; a 'wide' tile would leave a hole in a three-column row. */
@media (min-width: 561px) {
	.tyb-bento:has(> :nth-child(4):last-child) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.tyb-bento:has(> :nth-child(4):last-child) .tyb-bento__tile--wide { grid-column: auto; }
}


/* ---- "Experience Matters" -------------------------------------------------
 * STALE UNTIL 2026-10-04, corrected: this comment said the section under the
 * hero "is named now". It is not. The heading is OFF (themes/CLAUDE.md, "The
 * strip under the hero": the compact row of boxes is the design that works,
 * and a titled section costs ~250px under the hero). front-page.php prints no
 * .tyb-creds__head; these rules are kept for a build that adds one.
 */
.tyb-creds__head {
	text-align: center;
	padding: clamp(2.4rem, 5vw, 3.6rem) 0 clamp(1.4rem, 3vw, 2rem);
}
.tyb-creds__head .tyb-eyebrow { display: block; }
.tyb-creds__title {
	margin: .45rem 0 0;
	font-size: clamp(1.7rem, 1.2rem + 1.7vw, 2.5rem);
	line-height: 1.12;
}
/* G16 (fixed in place 2026-10-04). This was `.tyb-creds__list { margin-bottom:
   clamp(...) }`: ~50px of white under the strip with the dividers stopping
   short. The only strip front-page.php renders is .tyb-creds3, which zeroes
   it, so the rule was dead and its presence made every build re-add an
   override. It now exists only for the optional heading, which no template
   prints today. The strip has NO gap: measure (strip bottom minus list bottom
   = 0 at 1440 and 390), do not port a fix. */
.tyb-creds__head + .tyb-creds__list { margin-bottom: clamp(2.4rem, 5vw, 3.6rem); }
@media (max-width: 620px) {
	.tyb-creds__head { padding-top: clamp(2rem, 8vw, 2.6rem); }
}

/* ---- "How much is your home worth?" --------------------------------------
   The address-capture band, ported from his own site (Adam, 2026-09-23).
   Copy on the left, one field and a button on the right; it stacks on a phone
   with the field first, because on a phone the field IS the section. */
.tyb-valcta__in {
	display: grid;
	grid-template-columns: 1.05fr 1fr;
	gap: clamp(2rem, 5vw, 4.5rem);
	align-items: center;
}
.tyb-valcta__title { margin: .35rem 0 0; }
.tyb-valcta__points {
	list-style: none;
	margin: 1.4rem 0 0;
	padding: 0;
	display: grid;
	gap: .6rem;
}
.tyb-valcta__points li {
	display: flex;
	align-items: flex-start;
	gap: .6rem;
	font-size: 1.02rem;
	color: var(--tyb-body);
}
.tyb-valcta__points .tyb-icon { margin-top: .28rem; color: var(--tyb-brand); }

.tyb-valcta__form {
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 2px;
	padding: clamp(1.3rem, 3vw, 2rem);
}
.tyb-valcta__label {
	display: block;
	font-size: .76rem;
	font-weight: 600;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--tyb-muted);
	margin-bottom: .6rem;
}
.tyb-valcta__row { display: flex; gap: .6rem; flex-wrap: wrap; }
.tyb-valcta__row input {
	flex: 1 1 14rem;
	min-width: 0;
	padding: .85rem 1rem;
	font: inherit;
	font-size: 1rem;
	color: var(--tyb-ink);
	background: var(--tyb-tint);
	border: 1px solid var(--tyb-line);
	border-radius: 2px;
}
.tyb-valcta__row input:focus-visible {
	outline: none;
	border-color: var(--tyb-brand);
	box-shadow: 0 0 0 3px var(--tyb-brand-pale);
}
.tyb-valcta__row .tyb-btn { flex: 0 0 auto; }
.tyb-valcta__note {
	margin: .85rem 0 0;
	font-size: .86rem;
	color: var(--tyb-muted);
}

@media (max-width: 860px) {
	/*
	 * Copy first, then the field. It shipped the other way round — the form was
	 * pulled above the heading on the theory that "on a phone the field IS the
	 * section" — and that lands a phone visitor on a bare address box with the
	 * question it answers scrolled off underneath it. The heading is what makes
	 * typing your address make sense, so it goes first (Adam, 2026-09-23).
	 */
	.tyb-valcta__in { grid-template-columns: 1fr; gap: 1.6rem; }
	.tyb-valcta__form { order: 0; }
	.tyb-valcta__row .tyb-btn { flex: 1 1 100%; }
	.tyb-valcta__points { margin-top: 1.1rem; }
}


/* ───────────────────────────────────────────────────────────────────────────
   Trap 33 — the .tyb-tone--* swatches all set --tone, and --tone is used as
   TEXT on four elements (splitfeat__eye, journey__when, bento__num,
   journey__dot). So every tone has to be text-safe, not just whichever one
   the home page happens to show: "one tone passing is not the set passing."
   --tone-ink is the colour that goes ON a tone wash, so no rule ever has to
   reach for --surf or --dune to colour a word.
   Set --tone-ink per palette; this is a sane default on a light ground.
   ─────────────────────────────────────────────────────────────────────────── */
/* --tyb-tone-ink is declared in the first :root now, where set-palette.py sets it. */

/* ───────────────────────────────────────────────────────────────────────────
   Trap 55 — a phone that drags sideways for the whole scroll.
   The split panels rest at translateX(±28px) and the timeline items at
   translateX(18px) until the IntersectionObserver reveals them. A desktop
   gutter swallows that; a 390px viewport does not, so the document is ~398px
   wide and draggable. Under 900px both reveals move vertically — it reads the
   same, and it is the direction the reader is already going.
   These live at the END of the sheet on purpose (trap 51): a media query adds
   no specificity, so an override above the rule it overrides silently loses.
   ─────────────────────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
	html.js .tyb-splitfeat__panel[data-tyb-reveal] { transform: translateY(18px); }
	html.js .tyb-timeline .tyb-timeline__item { transform: translateY(18px); }
}

/* ───────────────────────────────────────────────────────────────────────────
   The Ken Burns hero (traps 58, 65, 67, 83).

   Three <picture> frames stacked, one keyframe animation, offset by a
   negative animation-delay computed in front-page.php. No <video>, no JS.

   THE KEYFRAMES HOLD PAST THE NEXT FRAME'S START. The obvious version fades
   frame N out over 29%–33.333% while frame N+1 fades in over its own 0%–4% —
   the same instant — so they are sequential, not overlapping, total opacity
   reaches 0.00 three times a cycle, and the hero flashes its own background
   colour for over a second on the first thing a prospect sees. Holding to 38%
   with the next frame already at full gives a real overlap. The scale has to
   be extended to match (1.09 at 33.333% → 1.103 at 38%) or the movement
   visibly stalls during the hold.

   Verify by pausing every animation and reading opacity at several
   currentTime values — never by watching. Two things to read: the MINIMUM
   SUM across the cycle (must stay at or above 1.00), and the t = 0 row (frame
   one must be the one showing).
   ─────────────────────────────────────────────────────────────────────────── */
.tyb-hero__kb {
	position: absolute;
	inset: 0;
	overflow: hidden;   /* frames scale to 1.103 and must not bleed */
	z-index: 0;
}

.tyb-hero__frame {
	position: absolute;
	inset: 0;
	display: block;
	opacity: 0;
	will-change: opacity, transform;
	animation: tyb-kb 27s linear infinite;
}

/* Without this a reduced-motion visitor, or any browser that has not started
   the animation, gets three transparent pictures over nothing. */
.tyb-hero__frame:first-child { opacity: 1; }

.tyb-hero__frame > img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 55%;
}

@keyframes tyb-kb {
	0%       { opacity: 0; transform: scale(1.000); }
	4%       { opacity: 1; }
	33.333%  { opacity: 1; transform: scale(1.090); }
	38%      { opacity: 0; transform: scale(1.103); }
	100%     { opacity: 0; transform: scale(1.000); }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-hero__frame { animation: none; opacity: 0; }
	.tyb-hero__frame:first-child { opacity: 1; transform: none; }
}

/* A media query that re-shows something hidden in a base rule HAS TO SAY
   `display` (trap 58). A phone block that set position, inset and opacity and
   left display: none gave frames that were positioned, animating, reported as
   animating, and invisible. Nothing hides them here; this re-states it so a
   later edit cannot reintroduce that. */
@media (max-width: 900px) {
	.tyb-hero__frame { display: block; }
	.tyb-hero__frame > img { object-position: center 50%; }
}

/* ───────────────────────────────────────────────────────────────────────────
   Trap 87 — the dead band at the top of a phone hero.

   Two correct rules stacking. `.tyb-hero` carries
   `padding-block: clamp(5rem, 10vh, 7rem)` — 90px on a 900px-tall phone — and
   `.tyb-home .tyb-hero__inner` SEPARATELY reserves `var(--tyb-header-h)` to
   clear the sticky masthead. Neither knows about the other, so the first word
   of the hero landed at y = 192 under a 96px header: ~96px of dead photograph
   on the device most prospects open the link with. It is invisible on desktop,
   where the hero is tall enough to absorb it.

   The inner's reservation is the load-bearing one, so the hero's own TOP
   padding is what goes on the home page under 900px. Check it by reading the
   top of the first child against the header height — dark sky above an eyebrow
   looks like composition, not like a bug.
   ─────────────────────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
	.tyb-home .tyb-hero { padding-top: 0; }
}

/* ───────────────────────────────────────────────────────────────────────────
   Trap 48 — HUD's Equal Housing mark is BLACK LINE ART, and this lineage's
   footer is near-black. Two builds shipped the compliance mark present,
   rendered and invisible, after porting the file without the CSS that has to
   come with it. Nothing checks it: the file is there, the <img> is there, and
   contrast tools only ever look at the hero. Look at the footer legal band in
   a real crop on any site with a dark footer — it is the one band no
   screenshot review scrolls to.

   The artwork itself is never edited. This inverts it at render time.
   ─────────────────────────────────────────────────────────────────────────── */
.tyb-eho--official {
	width: auto;
	height: 1.15em;
	vertical-align: -.22em;
	filter: brightness(0) invert(1);
	opacity: .9;
}

/* On a LIGHT footer the mark is already the right colour — undo the inversion
   rather than shipping a white-on-cream ghost. Set this on any build whose
   footer is a light wash. */
.tyb-foot--light .tyb-eho--official { filter: none; opacity: .75; }

/* ---------------------------------------------------------------------------
   Trap 59 — the floating call button carries the agent's face when there is one.
   Renders whenever parts/callbar.php finds assets/img/callbar-face.jpg; with
   no photo the plain phone glyph renders instead. Dropping a
   square crop at assets/img/callbar-face.jpg is the whole job.

   The plate grows from 2.35rem to 2.9rem, because a 2.35rem circle is not
   enough face to recognize anybody by, which is the entire point. The disc
   takes a white ring then a brand ring, because it floats over photographs and
   a bare circle dissolves into them. .tyb-callbar__ico sets a background
   colour and the face branch has to clear it, or a coloured ring sits inside
   the photograph.
   --------------------------------------------------------------------------- */
.tyb-callbar__ico--face {
	position: relative;
	width: 2.9rem;
	height: 2.9rem;
	background: none;
}
.tyb-callbar__face {
	display: block;
	width: 100%;
	height: 100%;
	border-radius: 50%;
	object-fit: cover;
	box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--tyb-accent);
}
.tyb-callbar__badge {
	position: absolute;
	right: -3px;
	bottom: -3px;
	display: grid;
	place-items: center;
	width: 1.3rem;
	height: 1.3rem;
	border-radius: 50%;
	background: var(--tyb-brand);
	color: #fff;
	box-shadow: 0 0 0 2px #fff;
}
.tyb-callbar__badge svg { width: 11px; height: 11px; }
/* .tyb-icon colours every icon with the accent, which here is the badge's own
   fill — the glyph would vanish into it. */
.tyb-callbar__badge .tyb-icon { color: #fff; }

/* ===========================================================================
   Ported from scott-o-connor, 2026-09-28. Each of these was found on the
   rendered page at 390px or by the contrast audit, not in the source.
   =========================================================================== */

/* The firm beside every point of contact — tyb_firm_tag() in functions.php.
   Never text-transformed: brokerage brands keep their own casing. */
.tyb-firmtag {
	display: block;
	margin-top: .3rem;
	font-size: .78rem;
	line-height: 1.35;
	text-transform: none;
	color: var(--tyb-muted);
}
.tyb-callbar__firm.tyb-firmtag { margin-top: .1rem; font-size: .62rem; font-style: normal; color: inherit; opacity: .85; white-space: nowrap; }
.tyb-closer .tyb-firmtag { text-align: center; margin-top: 1rem; }
.tyb-foot .tyb-firmtag { margin: 0 0 .6rem; color: rgba(255, 255, 255, .78); }

/* Trap 33, finished. --tone is a FILL; these four rules set words in it, and
   on scott-o-connor three of four tones failed as text (3.2–4.4:1). Each tone
   gets a text-safe shade. Re-pick the three hexes when set-palette changes
   the tones: they must read 4.5:1 on white and on the tone's pale wash. */
.tyb-tone--brand { --tone-text: var(--tyb-brand); }
.tyb-tone--surf  { --tone-text: var(--tyb-tone-ink); }  /* surf-dk is ~3.8:1 on white — a fill */
.tyb-tone--coral { --tone-text: var(--tyb-coral-dk); }
.tyb-tone--dune  { --tone-text: var(--tyb-tone-ink); }
.tyb-splitfeat__eye,
.tyb-timeline__when,
.tyb-journey__when,
.tyb-bento__num { color: var(--tone-text, var(--tyb-tone-ink)); }

/* The hero's phone number sits on a photograph: white, not the lifted accent
   (trap 42 — the accent over a bright still was the worst line in the hero). */
.tyb-hero__phone strong,
.tyb-hero__phone .tyb-icon { color: #fff; }

/* The creed's number broke across three lines beside a long firm name. */
.tyb-creed__call strong { white-space: nowrap; }

/* The strip stays compact on a phone (themes/CLAUDE.md, 2026-09-28): side by
   side, not three or four full-width rows (~400px) under the hero. */
@media (max-width: 640px) {
	.tyb-creds__list { grid-template-columns: repeat(3, 1fr); }
	.tyb-creds__list li { padding: 1.1rem .45rem; }
	.tyb-creds__label--num { font-size: 1.55rem; }
	.tyb-creds__label--num + .tyb-creds__note { font-size: .6rem; letter-spacing: .06em; line-height: 1.35; }
	/* (G1, 2026-10-04: `.tyb-creed__call { display: block; text-align: center }`
	   was removed here. The call line's phone layout is in the PHONE STANDARD
	   block at the end of the sheet.) */
}

/* The person first on a phone. The reverse split resets to source order
   under 900px, which put the headshot after the whole bio and the button. */
@media (max-width: 900px) {
	.tyb-split--reverse .tyb-split__media { order: -1; }
}


/* Trap 90 — the bar has a transparent 1px bottom border, so a wash on its
   background repeats its darkest stop into that 1px: a black hairline under
   the nav on every build with the trap-42 wash. Size the background to the
   border box so there is nothing to repeat. */
/* The home page sets the bar's background with the `background` shorthand,
   which resets background-origin, so this has to match its specificity
   and come after it (trap 51). */
.tyb-header .tyb-header__bar,
.tyb-home .tyb-header__bar { background-origin: border-box; }

/* Phone hero too crowded up top (Adam, 2026-09-29, across the recent demos).
   The trap-87 block zeroes .tyb-hero's top padding under 900px, which is right,
   but it left the first line of the hero flush against the 96px masthead.
   The inner keeps its header reservation and gains a real gap. Measure: the
   first child of .tyb-hero__inner should start ~44px below the header. */
@media (max-width: 900px) {
	.tyb-home .tyb-hero__inner { padding-top: calc(var(--tyb-header-h) + 2.75rem); }
}

/* The property slider on a phone, even margins (Adam, 2026-09-30: "i want the
   margins to be right on both right and left sides… its still placing on the
   left side"). The 1.5rem right padding for a "peek" was INSIDE the track, so
   100% columns came out 24px narrower than the content: 20px margin on the
   left, 44px on the right, on every site in the lineage. No padding, full-width
   card, snapped to start: every card sits exactly on the page gutters. The
   arrows above the row say it scrolls. */
@media (max-width: 899px) {
	.tyb-slider__track { grid-auto-columns: 100%; padding-inline: 0; margin-inline: 0; scroll-padding-inline: 0; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   THE JOHN CERINI STANDARD — 2026-10-02.
   John Cerini's first build used this template as it was and he said the site
   "felt basic". After the redesign Adam said: "this is the upgrade that we
   need all new sites to have." This block is that redesign, made generic.
   themes/john-cerini is the worked example; themes/CLAUDE.md "The bar since
   2026-10-02" is the brief.

   It sits at the END of the sheet on purpose (trap 51), and everything in it
   is written against tokens, so set-palette.py (which rewrites hex values in
   the FIRST :root only) recolours it without touching it. A build's own
   overrides go BELOW this block.
   ═══════════════════════════════════════════════════════════════════════════ */

/* The palette corrections every build used to make by hand in a closing
   :root block (accent = brand, tint = shell, faint text, white on --coral-br,
   a near-black --deep) are made at the source now: scripts/set-palette.py
   computes them, and --tyb-gold / -gold-lt / -gold-pale and --tyb-tone-ink
   with them, as hex in the FIRST :root. Hex on purpose: contrast-audit.js
   cannot read a CSS colour-mixing function and reports every such ground at
   1:1. If a value fails for one client's colours, re-declare it in a :root
   BELOW this block. */
:root { --tyb-radius: 14px; }
.tyb-journey__dot, .tyb-journey__when { color: var(--tone-text, var(--tyb-tone-ink)); }

/* ── masthead: three modes, chosen per client (profile()['masthead']) ──────
   LIGHT is the white bar with the colour logo. An illustrated client logo
   needs more room than the generated two-line lockup: John Cerini's uses
   --tyb-header-h/--tyb-bar-max 136px, --tyb-logo-max 112px, --tyb-logo-min
   72px and --tyb-bar-min 90px on desktop, and 74px/58px on a phone. Measure
   the wordmark in the SCROLLED bar before settling. */
@media (max-width: 900px) {
	:root { --tyb-logo-max: 64px; --tyb-logo-min: 46px; }
	.tyb-logo--header .tyb-logo__img { max-width: 66vw; object-fit: contain; object-position: left center; }
}
.tyb-mast--light .tyb-logo__img--light { display: none; }
.tyb-utility__tagline { text-transform: none; letter-spacing: .04em; }

/* DARK: the bar in the brand's dark colour on every page, the light logo on
   it. The dark logo stays in the flow (it carries the layout height and the
   alt text) and is only made invisible. The dropdown panel and the phone
   menu are their own light surfaces and keep dark type. */
.tyb-mast--dark .tyb-header__bar { background: var(--tyb-deep); border-bottom-color: rgba(255, 255, 255, .14); }
.tyb-mast--dark .tyb-utility { background: var(--tyb-deep-dk); }
.tyb-mast--dark .tyb-header .tyb-nav__list > li > a,
.tyb-mast--dark .tyb-header .tyb-nav__toggle,
.tyb-mast--dark .tyb-header .tyb-callnow { color: #fff; }
.tyb-mast--dark .tyb-header .tyb-nav__list > li > a::after { background: var(--tyb-gold-lt); }
.tyb-mast--dark .tyb-header .tyb-nav__sub a { color: var(--tyb-body); }
.tyb-mast--dark .tyb-header .tyb-header__actions .tyb-btn--sm { background: transparent; border: 1px solid rgba(255, 255, 255, .75); color: #fff; }
.tyb-mast--dark .tyb-header .tyb-header__actions .tyb-btn--sm:hover { background: #fff; border-color: #fff; color: var(--tyb-deep); }
.tyb-mast--dark .tyb-header .tyb-burger { background: transparent; border-color: rgba(255, 255, 255, .55); }
.tyb-mast--dark .tyb-header .tyb-burger .tyb-burger__box i { background: #fff; }
.tyb-mast--dark .tyb-logo--header .tyb-logo__img--light { opacity: 1; }
.tyb-mast--dark .tyb-logo--header .tyb-logo__img:not(.tyb-logo__img--light) { visibility: hidden; }

/* TRANSPARENT: header.php adds 'tyb-home' on the front page, which turns on
   the lineage's bar-over-the-hero rules (white nav, the light logo, turning
   solid white on scroll). Three things the lineage never had, and every build
   added by hand: a wash behind the white nav so it reads on a bright frame
   (trap 42) — two layers, the white one FIRST so it occludes the wash as the
   bar arrives; background-origin so the invisible bottom border does not
   repeat the wash's darkest stop as a hairline (trap 90); and room at the top
   of the new hero, whose card must clear the bar as well as its copy.
   The wash is a starting point. Score the nav on every frame at 1440 and 430. */
.tyb-mast--transparent.tyb-home .tyb-header__bar {
	background:
		linear-gradient(rgba(255, 255, 255, var(--tyb-shrink)), rgba(255, 255, 255, var(--tyb-shrink))),
		linear-gradient(to bottom, rgba(16, 18, 22, .56) 0%, rgba(16, 18, 22, .46) 70%, rgba(16, 18, 22, .24) 100%);
	background-origin: border-box;
	border-bottom-color: rgba(228, 222, 210, var(--tyb-shrink));
}
.tyb-mast--transparent.tyb-home .tyb-hero3 .tyb-hero__inner { padding-top: 0; }
.tyb-mast--transparent.tyb-home .tyb-hero3 { padding-top: calc(var(--tyb-header-h) + clamp(2.5rem, 6vh, 4.5rem)); }
@media (max-width: 900px) {
	.tyb-mast--transparent.tyb-home .tyb-hero3 { padding-top: calc(var(--tyb-header-h) + 2.75rem); }
	.tyb-mast--transparent.tyb-home .tyb-header__bar {
		background:
			linear-gradient(rgba(255, 255, 255, var(--tyb-shrink)), rgba(255, 255, 255, var(--tyb-shrink))),
			linear-gradient(to bottom, rgba(16, 18, 22, .60) 0%, rgba(16, 18, 22, .52) 69%, rgba(16, 18, 22, .28) 100%);
		background-origin: border-box;
	}
}

/* ── hero ───────────────────────────────────────────────────────────────── */
.tyb-hero3 {
	min-height: clamp(34rem, 78vh, 46rem);
	padding-block: clamp(3.5rem, 8vh, 6rem);
	background: var(--tyb-deep);
}
.tyb-hero3__grid {
	position: relative; z-index: 2; width: 100%;
	display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(19rem, 23.5rem);
	gap: clamp(2rem, 5vw, 5rem); align-items: center;
}
.tyb-hero3__copy { max-width: 43rem; }
.tyb-hero3 .tyb-hero__title { font-size: clamp(2.25rem, 1.25rem + 3.5vw, 3.9rem); line-height: 1.08; letter-spacing: -.022em; }
.tyb-hero3 .tyb-hero__lede { font-size: clamp(1.05rem, 1rem + .35vw, 1.25rem); max-width: 40ch; color: #fff; }
.tyb-hero3__eyebrow { display: inline-flex; align-items: center; gap: .8rem; margin-bottom: 1.1rem; }
.tyb-hero3__eyebrow::before { content: ""; width: 2.6rem; height: 2px; background: var(--tyb-gold-lt); }

/* The three credentials: a plain row with hairline dividers. No pills, no
   boxes behind the hero copy (feedback_hero_treatment). */
.tyb-hero3__chips { display: flex; flex-wrap: wrap; gap: .55rem 0; margin-top: 1.6rem; }
.tyb-hero3__chips li {
	display: inline-flex; align-items: center; gap: .5rem;
	padding: 0 1.1rem; color: #fff; font-size: .9rem; font-weight: 600; letter-spacing: .01em;
	border-left: 1px solid rgba(255, 255, 255, .45);
	text-shadow: 0 1px 2px rgba(10, 12, 16, .55);
}
.tyb-hero3__chips li:first-child { padding-left: 0; border-left: 0; }
.tyb-hero3__chips .tyb-li { width: 1.25rem; height: 1.25rem; color: var(--tyb-gold-lt); flex: none; }
.tyb-hero3 .tyb-hero__actions { margin-top: 1.9rem; }
.tyb-hero3 .tyb-hero__phone strong, .tyb-hero3 .tyb-hero__phone .tyb-icon { color: #fff; }

/* The valuation card: solid white, because inputs need a ground. */
.tyb-hero3__card {
	background: #fff; border-radius: var(--tyb-radius); border-top: 5px solid var(--tyb-gold);
	padding: clamp(1.5rem, 2.4vw, 2.1rem); box-shadow: 0 30px 60px -28px rgba(16, 18, 22, .7), 0 2px 6px rgba(16, 18, 22, .18);
	display: grid; gap: .85rem;
}
.tyb-hero3__card-eye { font-size: .7rem; letter-spacing: .16em; text-transform: uppercase; font-weight: 700; color: var(--tyb-accent); }
.tyb-hero3__card-title { font-size: clamp(1.45rem, 1.2rem + .9vw, 1.9rem); line-height: 1.12; margin: 0 0 .35rem; color: var(--tyb-deep); }
.tyb-hero3__card input {
	width: 100%; font: inherit; font-size: 1rem; color: var(--tyb-ink);
	padding: .95rem 1rem; border: 1px solid #C9CED6; border-radius: 8px; background: #FBFAF7;
}
.tyb-hero3__card input::placeholder { color: var(--tyb-faint); }
.tyb-hero3__card input:focus { outline: 2px solid var(--tyb-accent); outline-offset: 1px; border-color: var(--tyb-accent); }
.tyb-hero3__card .tyb-btn { justify-content: center; padding-block: 1rem; background: var(--tyb-deep); border-color: var(--tyb-deep); color: #fff; }
.tyb-hero3__card .tyb-btn:hover { background: var(--tyb-accent); border-color: var(--tyb-accent); }
.tyb-hero3__card-points { display: grid; gap: .4rem; margin-top: .35rem; }
.tyb-hero3__card-points li { display: flex; align-items: center; gap: .55rem; font-size: .88rem; color: var(--tyb-body); }
.tyb-hero3__card-points .tyb-li { width: 1.05rem; height: 1.05rem; color: var(--tyb-accent); stroke-width: 2.4; flex: none; }

/* The scrim: a left-to-right NEUTRAL shade under the copy column, clearing
   before the card. A scrim belongs to its photographs — re-score it on every
   frame, at 1440 and 430, in BOTH directions: text at 7-17:1 means the
   picture is being covered for nothing and the hero reads murky. */
.tyb-hero3 .tyb-hero__scrim {
	background:
		linear-gradient(to right, rgba(16, 18, 22, .62) 0%, rgba(16, 18, 22, .50) 42%, rgba(16, 18, 22, .12) 68%, rgba(16, 18, 22, .16) 100%),
		linear-gradient(to bottom, rgba(16, 18, 22, .10) 0%, rgba(16, 18, 22, .22) 50%, rgba(16, 18, 22, .30) 100%);
}

@media (max-width: 900px) {
	.tyb-hero3 { min-height: 0; padding-block: 2.6rem 2.4rem; }
	.tyb-hero3__grid { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
	.tyb-hero3 .tyb-hero__title { font-size: clamp(2.05rem, 1.5rem + 2.6vw, 2.6rem); }
	.tyb-hero3__chips { flex-direction: column; gap: .5rem; }
	.tyb-hero3__chips li { padding: 0; border-left: 0; }
	.tyb-hero3 .tyb-hero__scrim {
		background: linear-gradient(to bottom, rgba(16, 18, 22, .58) 0%, rgba(16, 18, 22, .56) 62%, rgba(16, 18, 22, .40) 100%);
	}
}

/* ── the figures: navy, gold numerals ───────────────────────────────────── */
.tyb-creds3 { background: var(--tyb-deep); border-bottom: 0; }
.tyb-creds3 .tyb-creds__list { display: grid; grid-template-columns: repeat(var(--tyb-n, 3), minmax(0, 1fr)); }
.tyb-creds3 .tyb-creds__list { gap: 1px; background: rgba(255, 255, 255, .16); margin-bottom: 0; }
.tyb-creds3 .tyb-creds__list li { background: var(--tyb-deep); padding-block: clamp(1.5rem, 3vw, 2.4rem); }
.tyb-creds3 .tyb-creds__label--num + .tyb-creds__note { color: #D5DEE8; }
.tyb-creds3 .tyb-creds__label--num { color: var(--tyb-gold-lt); font-size: clamp(2.3rem, 1.6rem + 2.4vw, 3.6rem); }
.tyb-creds3 .tyb-creds__note { color: #D5DEE8; }
@media (max-width: 640px) {
	.tyb-creds3 .tyb-creds__list { grid-template-columns: repeat(var(--tyb-n, 3), minmax(0, 1fr)); }
}

/* ── meet John: gold frame, credential badges ───────────────────────────── */
.tyb-meet3__media { position: relative; }
.tyb-meet3__media .tyb-figure { overflow: visible; }
.tyb-meet3__media img { border-radius: 10px; box-shadow: 18px 18px 0 0 var(--tyb-gold), 0 24px 48px -28px rgba(16, 18, 22, .55); }
.tyb-meet3 h2 { font-size: clamp(2rem, 1.4rem + 2.2vw, 3rem); }
.tyb-meet3__badges { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .7rem 1.5rem; margin: 1.6rem 0 .4rem; }
.tyb-meet3__badges li { display: flex; align-items: flex-start; gap: .6rem; font-weight: 600; color: var(--tyb-ink); font-size: .95rem; line-height: 1.35; }
.tyb-meet3__badges .tyb-li {
	flex: none; width: 1.45rem; height: 1.45rem; padding: .28rem; border-radius: 50%;
	background: var(--tyb-accent); color: #fff; stroke-width: 2.6;
}
@media (max-width: 640px) {
	.tyb-meet3__badges { grid-template-columns: minmax(0, 1fr); }
	.tyb-meet3__media img { box-shadow: 10px 10px 0 0 var(--tyb-gold); }
}

/* ── the sale, the taxes, the insurance ─────────────────────────────────── */
.tyb-svc3__grid { display: grid; grid-template-columns: repeat(var(--tyb-n, 3), minmax(0, 1fr)); gap: 1.5rem; margin-top: 2.5rem; }
.tyb-svc3__card {
	position: relative; display: flex; flex-direction: column; background: #fff;
	border: 1px solid var(--tyb-line); border-top: 5px solid var(--tyb-deep); border-radius: var(--tyb-radius);
	padding: 2rem 1.75rem 1.75rem; box-shadow: var(--tyb-shadow);
	transition: transform .35s var(--tyb-ease), box-shadow .35s var(--tyb-ease);
}
.tyb-svc3__card:nth-child(4n+2) { border-top-color: var(--tyb-accent-mid); }
.tyb-svc3__card:nth-child(4n+3) { border-top-color: var(--tyb-gold); }
.tyb-svc3__card:nth-child(4n+4) { border-top-color: var(--tyb-surf-dk); }
.tyb-svc3__card:hover { transform: translateY(-5px); box-shadow: var(--tyb-shadow-lg); }
.tyb-svc3__icon {
	display: grid; place-items: center; width: 3.6rem; height: 3.6rem; border-radius: 50%;
	background: var(--tyb-deep); color: var(--tyb-gold-lt); margin-bottom: 1.25rem;
}
.tyb-svc3__icon .tyb-li { width: 1.75rem; height: 1.75rem; }
.tyb-svc3__num { position: absolute; top: 1.35rem; right: 1.5rem; font-family: var(--tyb-display); font-size: 2.6rem; line-height: 1; color: #E3DDD0; }
.tyb-svc3__title { font-size: 1.6rem; margin-bottom: .6rem; }
.tyb-svc3__body { color: var(--tyb-body); margin-bottom: 1.4rem; }
.tyb-svc3__link { margin-top: auto; font-weight: 700; font-size: .84rem; letter-spacing: .06em; text-transform: uppercase; color: var(--tyb-accent); text-decoration: none; }
.tyb-svc3__link:hover { text-decoration: underline; }
@media (max-width: 900px) { .tyb-svc3__grid { grid-template-columns: minmax(0, 1fr); } }

/* ── the tax side of selling ────────────────────────────────────────────── */
.tyb-spec3__grid { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(2rem, 6vw, 5.5rem); align-items: start; }
.tyb-spec3__intro .tyb-btn { margin-top: 1.5rem; }
.tyb-spec3__note { margin-top: 1.25rem; font-size: .84rem; color: var(--tyb-muted); max-width: 34ch; }
.tyb-spec3__list { display: grid; gap: 1rem; counter-reset: none; }
.tyb-spec3__item {
	display: grid; grid-template-columns: 3.4rem minmax(0, 1fr); gap: 1.1rem; align-items: start;
	background: #fff; border: 1px solid var(--tyb-line); border-left: 5px solid var(--tyb-gold);
	border-radius: var(--tyb-radius); padding: 1.5rem 1.6rem; box-shadow: var(--tyb-shadow);
}
.tyb-spec3__num { font-family: var(--tyb-display); font-size: 2.4rem; line-height: 1; color: var(--tyb-deep); }
.tyb-spec3__title { font-size: 1.35rem; margin-bottom: .4rem; }
.tyb-spec3__body { color: var(--tyb-body); margin: 0; }
@media (max-width: 900px) {
	.tyb-spec3__grid { grid-template-columns: minmax(0, 1fr); }
	.tyb-spec3__item { grid-template-columns: 2.6rem minmax(0, 1fr); padding: 1.25rem 1.2rem; }
	.tyb-spec3__num { font-size: 1.9rem; }
}

/* ── reviews: one large, two beside it ──────────────────────────────────── */
.tyb-rev3__grid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 1.5rem; margin-top: 2.5rem; }
.tyb-rev3__card { position: relative; background: #fff; border-radius: var(--tyb-radius); padding: 2rem 1.9rem 1.7rem; box-shadow: var(--tyb-shadow); margin: 0; }
.tyb-rev3__card--lead { grid-row: span 2; display: flex; flex-direction: column; justify-content: center; padding: clamp(2rem, 4vw, 3.4rem); border-top: 5px solid var(--tyb-gold); }
.tyb-rev3__card--lead blockquote { font-family: var(--tyb-display); font-size: clamp(1.4rem, 1.1rem + 1.2vw, 2.05rem); line-height: 1.3; color: var(--tyb-ink); }
.tyb-rev3__mark { position: absolute; top: .2rem; right: 1.4rem; font-family: var(--tyb-display); font-size: 5.5rem; line-height: 1; color: var(--tyb-gold-pale); pointer-events: none; }
.tyb-rev3__card--lead .tyb-rev3__mark { font-size: 9rem; color: var(--tyb-gold-pale); }
.tyb-rev3__card .tyb-quote__stars { color: var(--tyb-gold); position: relative; }
.tyb-rev3__card blockquote, .tyb-rev3__card figcaption { position: relative; }
@media (max-width: 900px) { .tyb-rev3__grid { grid-template-columns: minmax(0, 1fr); } .tyb-rev3__card--lead { grid-row: auto; } }

/* ── the route: towns as legs of one road, numbered stops on a dashed line ─ */
.tyb-route3__logo { display: block; width: min(27rem, 78vw); height: auto; margin: 0 auto 1.6rem; }
.tyb-route3__leg { display: grid; grid-template-columns: 13.5rem minmax(0, 1fr); gap: clamp(1.5rem, 3vw, 3rem); align-items: center; margin-top: 3rem; }
.tyb-route3__label h3 { font-size: clamp(1.6rem, 1.3rem + 1vw, 2.1rem); margin: .8rem 0 .45rem; }
.tyb-route3__label p { font-size: .9rem; color: var(--tyb-muted); margin: 0; }
.tyb-route3__pin { display: grid; place-items: center; width: 2.9rem; height: 2.9rem; border-radius: 50%; background: var(--tyb-deep); color: var(--tyb-gold-lt); }
.tyb-route3__leg--b .tyb-route3__pin { background: var(--tyb-accent); color: #fff; }
.tyb-route3__stops { position: relative; display: grid; grid-template-columns: repeat(var(--tyb-n, 3), minmax(0, 1fr)); gap: 1.25rem; padding-top: 1.15rem; }
/* The road: a dashed gold line the numbered stops sit on. */
.tyb-route3__stops::before { content: ""; position: absolute; left: 0; right: 0; top: 1.15rem; border-top: 2px dashed var(--tyb-gold); }
.tyb-route3__stop { position: relative; display: flex; }
.tyb-route3__card {
	position: relative; flex: 1; display: flex; flex-direction: column; align-items: center; text-align: center;
	background: #fff; border: 1px solid var(--tyb-line); border-radius: var(--tyb-radius);
	padding: 2.2rem 1.25rem 1.4rem; text-decoration: none; color: inherit; box-shadow: var(--tyb-shadow);
	transition: transform .35s var(--tyb-ease), box-shadow .35s var(--tyb-ease), border-color .35s var(--tyb-ease);
}
.tyb-route3__card:hover { transform: translateY(-5px); box-shadow: var(--tyb-shadow-lg); border-color: var(--tyb-gold); }
.tyb-route3__dot {
	position: absolute; top: -1.15rem; left: 50%; transform: translateX(-50%);
	display: grid; place-items: center; width: 2.3rem; height: 2.3rem; border-radius: 50%;
	background: var(--tyb-deep); color: var(--tyb-gold-lt); font-size: .72rem; font-weight: 700; letter-spacing: .04em;
	box-shadow: 0 0 0 4px var(--tyb-tint);
}
.tyb-route3__leg--b .tyb-route3__dot { background: var(--tyb-accent); color: #fff; }
.tyb-route3__shape { width: 100%; height: 5.2rem; margin-bottom: .9rem; }
/* G4, second half (fixed in place 2026-10-04). This was
   `.tyb-route3__shape svg *`, which LOSES to `.tyb-market__shape .tyb-shape
   path` (accent at opacity .16) further up the sheet: the span carries both
   classes, so the first leg's towns were drawn at 16% and read as empty
   cards. Measured: fill accent / .16 before, surf / .7 after. */
.tyb-route3 .tyb-route3__shape svg * { fill: var(--tyb-surf); opacity: .7; }
/* G4 (fixed in place 2026-10-04). These three rules were :nth-of-type(even),
   which counts every sibling <div>, and the section heading is a div: the
   FIRST leg came out "even" and a one-leg site got the second leg's look.
   front-page.php now prints --a / --b from the leg's own index. The second
   leg's outline was opacity .42, too faint to read as a town on a white card
   (feedback_town_outlines_on_cards). */
.tyb-route3__leg--b .tyb-route3__shape svg * { fill: var(--tyb-coral); opacity: .7; }
.tyb-route3__name { font-family: var(--tyb-display); font-size: 1.3rem; line-height: 1.2; color: var(--tyb-ink); margin-bottom: .45rem; }
.tyb-route3__note { font-size: .86rem; color: var(--tyb-muted); line-height: 1.5; margin-bottom: 1rem; }
.tyb-route3__cta { margin-top: auto; font-size: .74rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--tyb-accent); }
@media (max-width: 900px) {
	.tyb-route3__leg { grid-template-columns: minmax(0, 1fr); margin-top: 2.25rem; }
	.tyb-route3__label { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: .9rem; align-items: center; }
	.tyb-route3__label h3 { margin: 0; }
	.tyb-route3__label p { grid-column: 1 / -1; margin-top: .5rem; }
	.tyb-route3__stops { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
	.tyb-route3__stops::before { display: none; }
}

/* ── footer: the client's own logo on a white panel (assets/img/logo-full.png) */
.tyb-foot__plate { display: inline-block; background: #fff; border-radius: 12px; padding: .9rem 1.2rem; max-width: 17.5rem; margin-bottom: 1.1rem; }
.tyb-foot__plate img { display: block; width: 100%; height: auto; }

/* ── the single listing ─────────────────────────────────────────────────── */
/* The listing ask box follows you down the page: sticky on the COLUMN, not
   the box inside it, desktop only. On a phone it would sit over the photographs. */
@media (min-width: 901px) {
	.tyb-listing__aside { position: sticky; top: calc(var(--tyb-bar-min) + 1.5rem); align-self: start; }
}

/* ── things the lighter footer and the gold exposed (template pass) ─────── */
/* --deep is the brand darkened 22% now, not near-black, so the footer's
   fine print at 48% white fell to ~4.3:1. Measured after the lift: 7+:1. */
.tyb-foot__legal-in { color: rgba(255, 255, 255, .74); }
.tyb-foot__legal-in a { color: rgba(255, 255, 255, .88); }
/* The fallback text lockup (no logo file yet) on the dark footer. */
.tyb-logo--footer .tyb-logo__sub { color: rgba(255, 255, 255, .82); }
/* Review stars are graphics: they need 3:1, which a pale second colour misses. */
.tyb-quote__stars { color: var(--tyb-dune-dk); }
.tyb-rev3__card .tyb-quote__stars { color: var(--tyb-dune-dk); }


/* ═══════════════════════════════════════════════════════════════════════════
   PHONE STANDARD 2026-10-04
   A prospect opens the link from a text, on a phone, and most see only the
   home page. Proved on a live demo at 390x664 (iPhone Safari on
   first load) and 390x844, then ported here so every new build starts with
   it. The whole standard is this ONE block plus one block in
   assets/js/theme.js with the same heading; tmp/audit-20261004/
   PARENT-CHANGES.md lists every edit. It sits at the end of the sheet on
   purpose (trap 51). A build's own overrides go BELOW it.

   Parent gaps closed in the same pass:
   G1 the creed's call line   G2 town-card CTA on touch   G5 two-box strip
   (G4, G16 and one G1 line were wrong rules and were fixed IN PLACE above.)

   P-A1 hero height   P-A2 call pill   P-A3 long stacks   P-A4 face
   P-A5 motion        P-A6 type and thumbs               P-A7 weight
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── G1: the call line under the creed (Adam, 2026-10-04) ─────────────────
   The phone glyph lives inside the number, so the two always sit on one
   baseline. On a phone the sentence goes above and the number becomes a real
   outlined button the same width as "Send a message", instead of a loose
   icon over centered text. parts/creed.php prints the comma only when the
   sentence ends in one (with a brokerage); it is hidden on a phone either
   way, because the sentence ends above a button there. */
.tyb-creed__call { display: inline-flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: .35rem .5rem; }
.tyb-creed__call-num { display: inline-flex; align-items: center; gap: .45rem; white-space: nowrap; }
@media (max-width: 640px) {
	.tyb-creed__actions { flex-direction: column; align-items: center; gap: 1.1rem; }
	.tyb-creed__actions > .tyb-btn { width: min(100%, 19rem); }
	.tyb-creed__call { display: flex; flex-direction: column; gap: .6rem; width: min(100%, 19rem); text-align: center; }
	.tyb-creed__call-text { font-size: .92rem; line-height: 1.4; }
	.tyb-creed__call-comma { display: none; }
	.tyb-creed__call-num {
		width: 100%; justify-content: center; padding: .85rem 1.2rem;
		border: 1.5px solid var(--tyb-brand); border-radius: 4px; background: rgba(255, 255, 255, .6);
		font-size: 1.05rem;
	}
}

/* ── G5: two boxes in the figure strip ────────────────────────────────────
   "Ship two boxes, never pad" (feedback_strip_no_modest_counts) is a normal
   outcome, and two boxes stretched edge to edge at 1440. Narrow the LIST,
   not the columns; the dark band still runs the full width. No phone rule is
   needed: with --tyb-n = 2 the list is already two columns at every width. */
.tyb-creds3 .tyb-creds__list:has(> li:nth-child(2):last-child) { width: min(100%, 44rem); margin-inline: auto; }


/* ── P-A1 / P-A4: the eyebrow row ─────────────────────────────────────────
   front-page.php wraps the eyebrow in .tyb-hero3__who and prints a full and
   a short eyebrow plus, when assets/img/callbar-face.jpg exists, the face.
   Above 640px the row is the eyebrow exactly as it was. */
.tyb-hero3__face,
.tyb-hero3__eye-short { display: none; }

@media (max-width: 640px) {
	/* One line: the short eyebrow, no gold rule in front of a face. */
	.tyb-hero3__eye-full { display: none; }
	.tyb-hero3__eye-short { display: inline; }
	.tyb-hero3__who { display: flex; align-items: center; gap: .8rem; margin-bottom: .45rem; }
	.tyb-hero3__who .tyb-hero3__eyebrow { margin-bottom: 0; gap: .55rem; }
	.tyb-hero3__who:not(.tyb-hero3__who--face) .tyb-hero3__eyebrow::before { width: 1.4rem; }
	.tyb-hero3__who--face .tyb-hero3__eyebrow::before { display: none; }

	/* The face: 52px, white ring then a brand ring, like the call pill's
	   (trap 59). The rings are box-shadow, so the margin keeps them inside
	   the row. A photo beside the eyebrow, never a panel behind the copy. */
	.tyb-hero3__who--face .tyb-hero3__face {
		display: block; flex: none; width: 52px; height: 52px; margin: 4px;
		border-radius: 50%; object-fit: cover;
		box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--tyb-accent), 0 6px 16px rgba(10, 12, 16, .45);
	}

	/* ── P-A1: the hero, shortened ─────────────────────────────────────────
	   Target: the valuation field fully inside the first 664px, the H1
	   starting by 170px, the whole hero under 900px. */
	.tyb-hero3 { padding-block: 1.5rem 1.6rem; }
	.tyb-mast--transparent.tyb-home .tyb-hero3 { padding-top: calc(var(--tyb-header-h) + .35rem); }
	/* LIGHT and DARK mastheads: the bar sits in the flow above the hero, so
	   the hero's own top padding is the whole gap. 1.5rem left the valuation
	   field 11px below a 664px first screen; .35rem gives exactly the
	   geometry of the transparent bar (the face 10px under the bar's edge). */
	.tyb-mast--light .tyb-hero3,
	.tyb-mast--dark .tyb-hero3 { padding-top: .35rem; }
	.tyb-hero3__grid { gap: .75rem; }
	.tyb-hero3 .tyb-hero__title { font-size: clamp(1.8rem, 1.2rem + 2.8vw, 2.05rem); line-height: 1.06; }
	.tyb-hero3 .tyb-hero__lede { font-size: 1rem; line-height: 1.45; margin-top: .7rem; }

	/* Chips: one wrapping row with hairline dividers, smaller type. */
	.tyb-hero3__chips { flex-direction: row; flex-wrap: wrap; gap: .3rem 0; margin-top: .6rem; }
	.tyb-hero3__chips li { gap: .3rem; padding: 0 .5rem; font-size: .75rem; border-left: 1px solid rgba(255, 255, 255, .45); }
	.tyb-hero3__chips li:first-child { padding-left: 0; border-left: 0; }
	.tyb-hero3__chips .tyb-li { width: .95rem; height: .95rem; }

	/* The two buttons share the row, so each is a full thumb target. */
	.tyb-hero3 .tyb-hero__actions { margin-top: .7rem; gap: .6rem; }
	.tyb-hero3 .tyb-hero__actions .tyb-btn { flex: 1 1 0; justify-content: center; min-height: 46px; padding: .7rem .5rem; }

	/* The call line: a 44px tap row (P-A6) that costs no more height than
	   the old 28px line plus its margin. */
	.tyb-hero3 .tyb-hero__phone { margin-top: .2rem; min-height: 44px; align-items: center; font-size: 1rem; }
	.tyb-hero3 .tyb-hero__phone .tyb-icon { margin-top: 0; }

	/* The valuation card: the three ticks go (they stay on desktop), the
	   padding and gaps tighten. The input keeps 16px type so iOS never zooms. */
	.tyb-hero3__card { padding: .8rem 1.1rem 1.1rem; gap: .5rem; }
	.tyb-hero3__card-title { margin-bottom: 0; font-size: 1.4rem; }
	.tyb-hero3__card input { padding-block: .75rem; line-height: 1.3; }
	.tyb-hero3__card .tyb-btn { padding-block: .85rem; min-height: 44px; }
	.tyb-hero3__card-points { display: none; }
}

/* The narrowest phones (360px): the chip icons go so the row stays one line
   and the valuation field stays on the first screen. */
@media (max-width: 380px) {
	.tyb-hero3__chips .tyb-li { display: none; }
}

/* ── P-A2: the call pill ──────────────────────────────────────────────────
   theme.js adds .is-hidden while the hero, the creed band, an inline form,
   the closer or the footer is on screen: over the hero it covered the
   second button and the valuation field, over the creed its phone button,
   on the contact page the Phone input, at the bottom the legal links, and
   each of those has its own call or send control. Nothing here hides the
   pill by itself, so a failed or blocked script leaves it visible, as
   before. */
.tyb-callbar { bottom: calc(clamp(.9rem, 2vw, 1.5rem) + env(safe-area-inset-bottom, 0px)); }

@keyframes tyb-cb-in   { from { opacity: 0; transform: translateY(140%); } to { opacity: 1; transform: none; } }
@keyframes tyb-cb-fade { from { opacity: 0; } to { opacity: 1; } }

@media (max-width: 900px) {
	.tyb-callbar { transition: transform .35s var(--tyb-ease), opacity .25s var(--tyb-ease), visibility 0s linear 0s; }
	/* Until theme.js has taken over (.tyb-cb on <html>) the pill arrives a
	   moment after the page, so it never flashes over the hero before the
	   script hides it. `backwards` only: once run, it holds nothing. Scoped
	   to :not(.tyb-cb) so it cannot replay each time .is-hidden comes off. */
	html:not(.tyb-cb) .tyb-callbar { animation: tyb-cb-in .4s var(--tyb-ease) .9s backwards; }
	.tyb-callbar.is-hidden {
		transform: translateY(140%); opacity: 0; visibility: hidden; pointer-events: none;
		transition: transform .35s var(--tyb-ease), opacity .25s var(--tyb-ease), visibility 0s linear .35s;
	}
	/* JS off: the pill is always there, so the last lines of the footer get
	   room under it. theme.js puts .tyb-cb on <html> once it is hiding the
	   pill over the footer, and the room is given back. */
	html:not(.tyb-cb) .tyb-foot__legal-in { padding-bottom: calc(20px + 5.25rem + env(safe-area-inset-bottom, 0px)); }
}
@media (max-width: 900px) and (prefers-reduced-motion: reduce) {
	html:not(.tyb-cb) .tyb-callbar { animation-name: tyb-cb-fade; }
	.tyb-callbar.is-hidden { transform: none; }
}

@media (max-width: 640px) {
	/* Compact: the face and the agent's own number, the firm's name under it
	   (never an office number). "Call <first name>" stays for a screen reader. */
	.tyb-callbar__call { gap: .6rem; padding: .45rem 1rem .55rem .5rem; }
	.tyb-callbar__txt strong {
		position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
		overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
	}
	.tyb-callbar__txt em { font-size: .92rem; }
	.tyb-callbar__firm.tyb-firmtag { font-size: .7rem; max-width: 9.5rem; white-space: normal; line-height: 1.2; }
}

/* ── P-A3: the long stacks ────────────────────────────────────────────────
   Route: two towns per row, outline and name; the note and the per-card CTA
   go, and one hint under the grid says what a tap does. No swipe rows. */
.tyb-route3__hint { display: none; }

@media (max-width: 640px) {
	.tyb-route3__leg { margin-top: 1.4rem; }
	.tyb-route3__stops { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.4rem .75rem; padding-top: 1.35rem; }
	/* An odd town out takes the full row rather than leaving a hole (trap 85). */
	.tyb-route3__stops:has(> :last-child:nth-child(odd)) > :last-child { grid-column: 1 / -1; }
	.tyb-route3__card { padding: 1.7rem .6rem 1rem; }
	.tyb-route3__shape { height: 3.6rem; margin-bottom: .55rem; }
	.tyb-route3__name { font-size: 1.1rem; margin-bottom: 0; }
	.tyb-route3__note,
	.tyb-route3__cta { display: none; }
	.tyb-route3__hint {
		display: block; margin: 1.1rem 0 0; text-align: center;
		font-size: .9rem; font-weight: 600; color: var(--tyb-muted);
	}

	/* The page was 15 screens. Sections, their headings and the footer sit
	   a little closer on a phone; nothing is hidden to do it. */
	.tyb-section { padding-block: 2.5rem; }
	.tyb-closer { padding-block: 2.5rem; }
	.tyb-head { margin-bottom: 1.25rem; }
	.tyb-head--split { gap: .9rem; }
	.tyb-head .tyb-lede { font-size: 1rem; line-height: 1.55; }
	.tyb-split { gap: 1.5rem; }
	.tyb-spec3__grid { gap: 1.5rem; }
	.tyb-spec3__list { gap: .75rem; }
	.tyb-spec3__item { padding: 1rem 1.05rem; }
	.tyb-creds3 .tyb-creds__list li { padding-block: 1.25rem; }
	.tyb-foot__in { gap: 20px; padding-block: 30px 24px; }

	/* Services: compact rows. Icon left; title, body and link right. */
	.tyb-svc3__grid { gap: .8rem; margin-top: .4rem; }
	.tyb-svc3__card { display: grid; grid-template-columns: 2.75rem minmax(0, 1fr); column-gap: .9rem; align-items: start; padding: 1.05rem 1.1rem .95rem; border-top-width: 4px; }
	.tyb-svc3__card:not(:has(.tyb-svc3__icon)) { grid-template-columns: minmax(0, 1fr); }
	.tyb-svc3__icon { grid-column: 1; grid-row: 1 / span 3; width: 2.75rem; height: 2.75rem; margin: .15rem 0 0; }
	.tyb-svc3__icon .tyb-li { width: 1.3rem; height: 1.3rem; }
	.tyb-svc3__icon ~ .tyb-svc3__title,
	.tyb-svc3__icon ~ .tyb-svc3__body,
	.tyb-svc3__icon ~ .tyb-svc3__link { grid-column: 2; }
	.tyb-svc3__num { display: none; }
	.tyb-svc3__title { font-size: 1.25rem; margin-bottom: .2rem; }
	.tyb-svc3__body { font-size: .94rem; line-height: 1.5; margin-bottom: .45rem; }
}

/* The whole service card is the tap target (it holds one link), every width. */
.tyb-svc3__link::after { content: ""; position: absolute; inset: 0; border-radius: inherit; }

/* ── P-A5: motion ─────────────────────────────────────────────────────────
   The hero copy rises into place, once. CSS only; the H1 is left out so the
   headline paints at once and nothing here waits on a script. `both` ends on
   the visible state. Off under reduced motion. */
@media (prefers-reduced-motion: no-preference) {
	@keyframes tyb-rise { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
	.tyb-hero3__who,
	.tyb-hero3 .tyb-hero__lede,
	.tyb-hero3__chips,
	.tyb-hero3 .tyb-hero__actions,
	.tyb-hero3 .tyb-hero__phone,
	.tyb-hero3__card { animation: tyb-rise .55s var(--tyb-ease) both; }
	.tyb-hero3__who                 { animation-delay: .05s; }
	.tyb-hero3 .tyb-hero__lede      { animation-delay: .12s; }
	.tyb-hero3__chips               { animation-delay: .19s; }
	.tyb-hero3 .tyb-hero__actions   { animation-delay: .26s; }
	.tyb-hero3 .tyb-hero__phone     { animation-delay: .33s; }
	.tyb-hero3__card                { animation-delay: .30s; }
}
/* The figures count up (front-page.php adds data-tyb-count; the counter is
   the existing one in theme.js). Fixed-width digits so the cell does not
   jitter while they run. */
.tyb-creds__label--num { font-variant-numeric: tabular-nums; }

/* ── P-A6: legibility and thumbs ──────────────────────────────────────────
   A press answers the thumb. Not on listing cards: they sit in a swipe row
   and would flinch at the start of every swipe. */
.tyb-btn,
.tyb-callbar__call,
.tyb-route3__card,
.tyb-svc3__card,
.tyb-svc3__link { -webkit-tap-highlight-color: transparent; }
.tyb-btn:active,
.tyb-callbar__call:active { transform: scale(.975); transition-duration: .08s; }
.tyb-route3__card:active,
.tyb-svc3__card:active { transform: scale(.985); transition-duration: .08s; }

/* G2. No hover on a touch screen, so the town card's CTA is simply shown
   (it was opacity 0 until :hover, so on a phone the default town grid read
   as shapes and names with no cue that a card can be tapped). */
@media (hover: none) {
	.tyb-market__cta { opacity: 1; transform: none; }
}

@media (max-width: 640px) {
	/* Nothing under 11px. */
	.tyb-creds__label--num + .tyb-creds__note { font-size: .7rem; letter-spacing: .05em; }
	.tyb-creds3 .tyb-creds__list:has(> li:nth-child(2):last-child) .tyb-creds__note { font-size: .76rem; }
	.tyb-card__status,
	.tyb-card__repd { font-size: .7rem; }
	.tyb-foot__h { font-size: .72rem; }

	/* 44px tap rows. The listing title's padding is taken back by its margin,
	   so the card does not grow. */
	.tyb-card__title a { display: block; padding-block: 13px; margin-block: -13px; }
	.tyb-nav__sub a { min-height: 44px; }
	.tyb-slider__btn { width: 2.75rem; height: 2.75rem; }
	.tyb-svc3__link { min-height: 44px; display: flex; align-items: center; gap: .35rem; margin-block: -.55rem; }
	.tyb-foot__menu a,
	.tyb-foot__link { padding-block: 11px; }
	.tyb-foot__social a { display: inline-block; padding-block: 12px; }
	.tyb-foot__legalnav { gap: 0 1.25rem; margin: 2px 0; }
	.tyb-foot__legalnav a { display: inline-block; padding-block: 13px; }
	/* The menu in two columns pays for the taller rows. */
	.tyb-foot__menu { columns: 2; column-gap: 1.5rem; }
	.tyb-foot__menu li { break-inside: avoid; }
}

/* ── P-A7: weight ─────────────────────────────────────────────────────────
   Frames 2..n have no image until theme.js fills them in after window load
   and adds .is-live. Until then nothing animates and frame 1 holds, at the
   scale its animation starts from, so going live does not jump. The
   keyframes, the duration and the delays are untouched (traps 58, 65, 83). */
.tyb-hero__kb:not(.is-live) .tyb-hero__frame { animation: none; }
.tyb-hero__kb:not(.is-live) .tyb-hero__frame:first-child { opacity: 1; transform: scale(var(--tyb-kb-s0, 1.012)); }
@media (prefers-reduced-motion: reduce) {
	.tyb-hero__kb .tyb-hero__frame:first-child,
	.tyb-hero__kb:not(.is-live) .tyb-hero__frame:first-child { transform: none; }
}
/* ── Review fixes (two reviewers, 2026-10-04). Part of the standard: port
   these with the rest. They sit last in the block so they win (trap 51). */
@media (max-width: 900px) {
	/* P-A2. On the front page, with scripting on, the pill waits 6s for
	   theme.js and not .9s: on a slow connection the footer script can run
	   more than .9s after first paint, and the pill slid in over the second
	   hero button before it was hidden. Still an arrival, not a hide: if the
	   script never runs the pill comes in at 6s, so the page is never left
	   without it. JS off keeps the .9s arrival (no .js on <html>). */
	html.js:not(.tyb-cb) .tyb-front .tyb-callbar { animation-delay: 6s; }
}
@media (max-width: 640px) {
	/* The creed's attribution: no single orphan word on the second line. */
	.tyb-creed__attrib { text-wrap: balance; letter-spacing: .1em; }
	/* The service title was 3px above its body and read as glued to it. */
	.tyb-svc3__title { margin-bottom: .4rem; }
	/* Explore: three columns, so seven links make three rows and not four. */
	.tyb-foot__menu { columns: 3; column-gap: 1rem; }
	/* Nothing under 11px, inner pages too (contact, home valuation). */
	.tyb-contact__heading { font-size: .7rem; }
}

/* ═════════════════════════ end PHONE STANDARD 2026-10-04 ═════════════════ */


/* ═══════════════ ROUND 2 2026-10-04 — FORMS (F1-F7) ═══════════════════════
   One simple form everywhere (modal, contact page, valuation page): Name,
   Phone, Email, an optional short message, one button. No subject dropdown.
   Inputs are 16px or more (no zoom on an iPhone) and 50px tall; on a phone
   the whole modal form fits one 390 x 664 screen. */
.tyb-form { gap: .9rem; }
.tyb-field input,
.tyb-field textarea { font-size: max(1rem, 16px); }
.tyb-field input { min-height: 50px; padding-block: .65rem; }
.tyb-field textarea { min-height: 5.4rem; }
.tyb-field label .tyb-form__opt { font-style: normal; text-transform: none; letter-spacing: 0; color: var(--tyb-muted); }
.tyb-field input[aria-invalid="true"] { border-color: #C0392B; }
.tyb-form__hint { margin: -.4rem 0 0; font-size: .86rem; line-height: 1.4; color: var(--tyb-muted); }
.tyb-form__lede { margin: 0; font-size: 1.02rem; line-height: 1.5; color: var(--tyb-muted); }
.tyb-form__send { min-height: 52px; }
.tyb-form__note:empty { min-height: 0; }
.tyb-contact__form .tyb-alert { margin: 1.25rem 0 0; }
.tyb-contact__form .tyb-form { margin-top: 1.4rem; }
.tyb-modal__head { margin-bottom: 1.25rem; }
.tyb-modal__head h2 { margin-bottom: .45rem; padding-inline: 1.75rem; }

@media (max-width: 640px) {
	.tyb-modal { padding: .75rem; }
	.tyb-modal__panel { max-height: calc(100vh - 1.5rem); max-height: calc(100dvh - 1.5rem); padding: 1.6rem 1.1rem 1.1rem; }
	.tyb-modal__head { margin-bottom: .85rem; }
	.tyb-modal__head h2 { font-size: 1.35rem; line-height: 1.2; margin-bottom: .35rem; }
	.tyb-modal__lede { font-size: .9rem; line-height: 1.4; }
	.tyb-modal .tyb-form { gap: .6rem; }
	.tyb-modal .tyb-field { gap: .25rem; }
	.tyb-modal .tyb-field__row { gap: .6rem; }
	.tyb-modal .tyb-field textarea { min-height: 4.6rem; }
	.tyb-modal .tyb-form__hint { margin-top: -.2rem; }
}
/* ═══════════════ end ROUND 2 2026-10-04 — FORMS ═══════════════════════════ */


/* ═══════════════ ROUND 2 2026-10-04 — HOME (H1-H6) ═════════════════════════
   The round-2 PHOTO BAND rules (.tyb-band3, parts/photo-band.php,
   gallery()) stood here. Removed in the SLEEK HOME pass, 2026-10-04: the
   owner called the band "random, like taking up space", the part is deleted
   and nothing prints those classes.
   The services-card grid is no longer rendered on the home page; its rules
   (.tyb-svc3, .tyb-paths) are left in the sheet, unused there. */
/* ── Reviews (H5): the total as the heading, long reviews open in place ─────
   Markup: front-page.php, section.tyb-rev4 (it keeps the tyb-rev3 classes,
   so the card rules above still apply). The whole review is always in the
   page. The clamp only applies once theme.js has added .tyb-clamp to <html>,
   so with scripting off, or a script that failed to load, the full text
   shows and the button stays hidden. */
.tyb-rev4__total { display: flex; align-items: baseline; justify-content: center; gap: .55rem; }
.tyb-rev4__total strong { font-family: var(--tyb-display); font-weight: 400; font-size: clamp(3.6rem, 2.4rem + 5vw, 6rem); line-height: .95; color: var(--tyb-brand); letter-spacing: -.01em; }
.tyb-rev4__total span { font-size: clamp(1.5rem, 1.2rem + 1.2vw, 2.2rem); }
.tyb-rev4__grid[data-n="1"] { grid-template-columns: minmax(0, 46rem); justify-content: center; }
.tyb-rev4__card { display: flex; flex-direction: column; align-items: flex-start; }
.tyb-rev4__card.tyb-rev3__card--lead { justify-content: center; }
.tyb-rev4__card blockquote { margin-bottom: 1.1rem; }
.tyb-rev4__card figcaption { margin-top: auto; }
.tyb-rev4__card.tyb-rev3__card--lead figcaption { margin-top: 0; }
html.tyb-clamp .tyb-rev4__text:not(.is-open) { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 5; line-clamp: 5; overflow: hidden; }
html.tyb-clamp .tyb-rev3__card--lead .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 7; line-clamp: 7; }
.tyb-rev4__more { position: relative; margin: -.45rem 0 1.1rem; padding: .35rem 0; min-height: 2rem; background: none; border: 0; font: inherit; font-size: .9rem; font-weight: 600; color: var(--tyb-brand); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.tyb-rev4__more[hidden] { display: none; }
.tyb-rev4 .tyb-quotes__more { margin-top: 2.25rem; }

@media (max-width: 900px) {
	.tyb-rev4__grid { gap: .85rem; margin-top: 1.5rem; }
	.tyb-rev4__card.tyb-rev3__card--lead { padding: 1.7rem 1.35rem 1.4rem; }
	.tyb-rev4__card.tyb-rev3__card--lead blockquote { font-size: 1.32rem; line-height: 1.32; }
	html.tyb-clamp .tyb-rev3__card--lead .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 6; line-clamp: 6; }
	/* the others: compact cards */
	.tyb-rev4__card:not(.tyb-rev3__card--lead) { padding: 1.1rem 1.15rem 1rem; }
	.tyb-rev4__card:not(.tyb-rev3__card--lead) .tyb-rev3__mark { display: none; }
	.tyb-rev4__card:not(.tyb-rev3__card--lead) .tyb-quote__stars { margin-bottom: .45rem; font-size: .85rem; }
	.tyb-rev4__card:not(.tyb-rev3__card--lead) blockquote { font-size: .95rem; line-height: 1.5; margin-bottom: .8rem; }
	html.tyb-clamp .tyb-rev4__card:not(.tyb-rev3__card--lead) .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 4; line-clamp: 4; }
	.tyb-rev4__more { margin-top: -.3rem; margin-bottom: .7rem; min-height: 2.75rem; }
	.tyb-rev4 .tyb-quotes__more { margin-top: 1.4rem; }
	.tyb-rev4 .tyb-quotes__more .tyb-btn { width: 100%; justify-content: center; text-align: center; }
}
/* ═══════════════ end ROUND 2 2026-10-04 — HOME ════════════════════════════ */


/* ═══════════════ ROUND 2 2026-10-04 — REVIEW FIXES ═════════════════════════
   1. The modal's close button is a 44px tap target (it was 36px). It sits
      closer to the corner so the larger box does not reach the heading, and
      the heading keeps clear of it on both sides.
   2. (A rule for the photo band after the listings stood here. The band was
      removed in the SLEEK HOME pass, and the rule with it.) */
.tyb-modal__close { top: .35rem; right: .35rem; width: 2.75rem; height: 2.75rem; min-width: 44px; min-height: 44px; }
.tyb-modal__head h2 { padding-inline: 2.4rem; }
/* ═══════════════ end ROUND 2 2026-10-04 — REVIEW FIXES ═════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   SLEEK HOME 2026-10-04
   The home page becomes photo-led (DECISIONS-3). One appended block: every
   rule here is either new (the "5" classes) or overrides an older rule of
   equal specificity by coming later (trap 51).

   Grammar, the same in every section:
     .tyb-kick5   the tiny tracked caption with the four-color rule before it
     .tyb-h5      the large thin serif heading
     .tyb-tile5   a photograph with a 1-3 word label set on it (S2 and S7)
     .tyb-arrow5  the thin arrow
   Photo-backed text bands: S3 .tyb-nums5, S8 .tyb-creed5, S10 .tyb-lead5.
   Each takes its photograph only with the --photo modifier; without it the
   band falls back to a ground that needs no image.

   Scrims are NEUTRAL (rgb 12 18 22) and their strength is one custom
   property per band, so a build sets what its photograph measures, no more:
     --tyb-scrim-nums, --tyb-scrim-creed, --tyb-scrim-lead
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
	--tyb-scrim5:      12, 18, 22;
	--tyb-band5:       clamp(5rem, 9vw, 8.5rem);
	--tyb-radius5:     6px;
	--tyb-rule4: linear-gradient(90deg,
		var(--tyb-brand) 0 25%, var(--tyb-surf) 25% 50%,
		var(--tyb-coral) 50% 75%, var(--tyb-dune) 75% 100%);
}

/* ------------------------------------------------------------ the grammar -- */

.tyb-kick5 {
	display: flex;
	align-items: center;
	gap: .85rem;
	margin: 0 0 1.25rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	line-height: 1.4;
	letter-spacing: .26em;
	text-transform: uppercase;
	color: var(--tyb-brand);
}
.tyb-kick5::before {
	content: '';
	flex: none;
	width: 32px; height: 2px;
	background: var(--tyb-rule4);
}

/* One or two lines, never a three-line stack in half the width. */
.tyb-h5 {
	font-size: clamp(2.2rem, 1.3rem + 2.9vw, 3.75rem);
	line-height: 1.04;
	letter-spacing: -.022em;
	max-width: 20ch;
	text-wrap: balance;
}

.tyb-arrow5 { flex: none; display: block; width: 30px; height: 12px; overflow: visible; transition: transform .45s var(--tyb-ease); }

/* Desktop gets more air; under 641px the phone standard's padding stays. */
@media (min-width: 641px) {
	.tyb-intro5, .tyb-meet5, .tyb-rev5, .tyb-list5, .tyb-towns5, .tyb-spec5 { padding-block: var(--tyb-band5); }
}

/* Light grounds alternate between white and the shell, so two neighbors
   never need a rule between them. */
.tyb-intro5, .tyb-rev5, .tyb-towns5 { background: #fff; }
.tyb-meet5, .tyb-list5, .tyb-spec5 { background: var(--tyb-shell); }

/* -------------------------------------------------- the photo tile (S2, S7) -- */

.tyb-tile5 {
	position: relative;
	display: block;
	isolation: isolate;
	overflow: hidden;
	aspect-ratio: 1 / 1;
	border-radius: var(--tyb-radius5);
	background: var(--tyb-deep);
	color: #fff;
	-webkit-tap-highlight-color: transparent;
	transition: transform .25s var(--tyb-ease);
}
.tyb-tile5:hover, .tyb-tile5:focus-visible { color: #fff; }
.tyb-tile5__img {
	position: absolute; inset: 0;
	z-index: -2;
	width: 100%; height: 100%;
	object-fit: cover;
	transition: transform 1.6s var(--tyb-ease);
}
/* Bottom-up only, and only as tall as the label. The top two thirds of the
   photograph are untouched. */
.tyb-tile5::after {
	content: '';
	position: absolute; inset: 0;
	z-index: -1;
	background: linear-gradient(to top,
		rgba(var(--tyb-scrim5), .78) 0%,
		rgba(var(--tyb-scrim5), .56) 16%,
		rgba(var(--tyb-scrim5), .18) 34%,
		rgba(var(--tyb-scrim5), 0) 50%);
	transition: opacity .45s var(--tyb-ease);
}
.tyb-tile5__label {
	position: absolute; left: 0; right: 0; bottom: 0;
	display: flex;
	align-items: center;
	gap: 1rem;
	padding: 0 clamp(1.1rem, 2vw, 1.75rem) clamp(1.15rem, 2vw, 1.7rem);
}
.tyb-tile5__name {
	font-family: var(--tyb-display);
	font-size: clamp(1.7rem, 1.15rem + 1.6vw, 2.4rem);
	line-height: 1.02;
	letter-spacing: -.015em;
	text-shadow: 0 1px 14px rgba(var(--tyb-scrim5), .35);
}
.tyb-tile5__line {
	flex: 1 1 auto;
	height: 1px;
	background: rgba(255, 255, 255, .5);
	transform-origin: right center;
	transition: background-color .45s var(--tyb-ease);
}
@media (hover: hover) {
	.tyb-tile5:hover .tyb-tile5__img { transform: scale(1.06); }
	.tyb-tile5:hover .tyb-arrow5 { transform: translateX(6px); }
	.tyb-tile5:hover .tyb-tile5__line { background: #fff; }
}
.tyb-tile5:focus-visible { outline: 2px solid var(--tyb-brand); outline-offset: 4px; }
.tyb-tile5:focus-visible .tyb-tile5__img { transform: scale(1.06); }
.tyb-tile5:active { transform: scale(.985); }

/* ------------------------------------------- S2 intro + three photo tiles -- */

/* Heading and paragraph side by side and centered on each other, then the
   tiles: the heading and the three labels are on one screen at 1440x900. */
.tyb-intro5__top {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	align-items: center;
	gap: clamp(2rem, 6vw, 6rem);
}
.tyb-intro5__head .tyb-kick5 { margin-bottom: 1rem; }
.tyb-intro5__head .tyb-h5 { max-width: 18ch; }
.tyb-intro5__text {
	margin: 0;
	max-width: 46ch;
	font-size: clamp(1rem, .95rem + .28vw, 1.15rem);
	line-height: 1.75;
	color: var(--tyb-body);
}
.tyb-tiles5 {
	list-style: none;
	margin: clamp(2.25rem, 4vw, 3.5rem) 0 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(1rem, 2vw, 1.75rem);
}
.tyb-tiles5__item { min-width: 0; }

@media (min-width: 901px) {
	.tyb-intro5 { padding-top: clamp(4.5rem, 7vw, 6.5rem); }
}
@media (max-width: 900px) {
	.tyb-intro5__top { grid-template-columns: minmax(0, 1fr); gap: 1.1rem; align-items: start; }
}
/* Phone: one wide tile and two halves. Shorter than three stacked and it
   reads as a composition, not a list. */
@media (max-width: 640px) {
	.tyb-tiles5 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .7rem; margin-top: 1.6rem; }
	.tyb-tiles5__item:first-child { grid-column: 1 / -1; }
	.tyb-tiles5 .tyb-tile5 { aspect-ratio: auto; height: 158px; }
	/* A short tile: the label takes a third of it, so the gradient climbs
	   higher than on the tall desktop tile. Measured on a white sofa. */
	.tyb-tiles5 .tyb-tile5::after {
		background: linear-gradient(to top,
			rgba(var(--tyb-scrim5), .74) 0%,
			rgba(var(--tyb-scrim5), .56) 30%,
			rgba(var(--tyb-scrim5), .2) 58%,
			rgba(var(--tyb-scrim5), 0) 82%);
	}
	.tyb-tiles5__item:first-child .tyb-tile5 { height: 176px; }
	.tyb-tiles5 .tyb-tile5__label { padding: 0 .9rem .85rem; gap: .7rem; }
	.tyb-tiles5 .tyb-tile5__name { font-size: 1.6rem; }
	.tyb-tiles5__item:not(:first-child) .tyb-tile5__line,
	.tyb-tiles5__item:not(:first-child) .tyb-arrow5 { display: none; }
	.tyb-intro5__text { font-size: 1rem; line-height: 1.6; }
}

/* --------------------------------- S3 by the numbers, over a photograph -- */

.tyb-nums5 {
	position: relative;
	isolation: isolate;
	overflow: hidden;
	padding-block: clamp(4.75rem, 9vw, 8.5rem);
	background: var(--tyb-deep);
	color: #fff;
}
.tyb-nums5__img {
	position: absolute; inset: 0;
	z-index: -2;
	width: 100%; height: 100%;
	object-fit: cover;
}
.tyb-nums5--photo::before {
	content: '';
	position: absolute; inset: 0;
	z-index: -1;
	/* Light over the top of the photograph, stronger under the row of
	   figures, where 11px captions have to hold on roofs and sand. */
	background: linear-gradient(to top,
		rgba(var(--tyb-scrim5), calc(var(--tyb-scrim-nums, .36) + .2)) 0%,
		rgba(var(--tyb-scrim5), calc(var(--tyb-scrim-nums, .36) + .16)) 46%,
		rgba(var(--tyb-scrim5), var(--tyb-scrim-nums, .36)) 76%,
		rgba(var(--tyb-scrim5), var(--tyb-scrim-nums, .36)) 100%);
}
/* Left-aligned: S8 is the page's one centered band. */
.tyb-nums5 .tyb-kick5 { color: #fff; }
.tyb-nums5__title {
	max-width: 16ch;
	font-size: clamp(2rem, 1.3rem + 2.6vw, 3.4rem);
	color: #fff;
}
.tyb-nums5__list {
	list-style: none;
	margin: clamp(2.75rem, 6vw, 5.5rem) 0 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(var(--tyb-n, 4), minmax(0, 1fr));
	column-gap: clamp(1.25rem, 3vw, 3rem);
}
/* A hairline over each figure, in place of dividers between them. */
.tyb-nums5__list li { padding-top: clamp(1rem, 1.6vw, 1.4rem); border-top: 1px solid rgba(255, 255, 255, .45); }
.tyb-nums5__num {
	display: block;
	font-family: var(--tyb-display);
	font-size: clamp(3.5rem, 1.7rem + 6vw, 6.75rem);
	line-height: .92;
	letter-spacing: -.035em;
	font-variant-numeric: tabular-nums;
	color: #fff;
}
.tyb-nums5__note {
	display: block;
	margin: 1rem 0 0;
	max-width: 26ch;
	font-size: .6875rem;
	font-weight: 600;
	line-height: 1.6;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: #fff;
}
/* Figures and captions are type on a photograph: a soft neutral shadow, never
   a colored one. */
.tyb-nums5--photo .tyb-nums5__in { text-shadow: 0 1px 20px rgba(var(--tyb-scrim5), .5); }

@media (max-width: 640px) {
	.tyb-nums5 { padding-block: 3.25rem; }
	.tyb-nums5__list { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.25rem; row-gap: 1.75rem; margin-top: 2rem; }
	/* An odd count: the last figure takes the full row. */
	.tyb-nums5__list li:last-child:nth-child(odd) { grid-column: 1 / -1; }
	.tyb-nums5__list li { padding-top: .85rem; }
	.tyb-nums5__num { font-size: 3.6rem; }
	.tyb-nums5__note { margin-top: .6rem; letter-spacing: .16em; max-width: none; }
}

/* ------------------------------------------------------ S4 meet the agent -- */

.tyb-meet5 .tyb-split {
	grid-template-columns: minmax(0, .92fr) minmax(0, 1fr);
	gap: clamp(3rem, 8vw, 8rem);
}
.tyb-meet5 .tyb-split__media--portrait { max-width: 31rem; margin-inline: 0; }
/* Every shape takes the frame; only a headshot ('portrait') is cut tall. A
   'scene' or 'team' photograph keeps its own frame (the --scene / --team
   rules earlier in the sheet). */
.tyb-meet5__media img {
	border-radius: var(--tyb-radius5);
	box-shadow: 14px 14px 0 0 var(--tyb-gold);
}
.tyb-meet5 .tyb-split__media--portrait img {
	aspect-ratio: 5 / 7;
	object-fit: cover;
}
.tyb-meet5 .tyb-meet5__name { max-width: none; font-size: clamp(2.6rem, 1.5rem + 4vw, 4.75rem); line-height: .98; }
.tyb-meet5__firm {
	margin: .9rem 0 1.6rem;
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .22em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}
.tyb-meet5 .tyb-prose { max-width: 46ch; font-size: clamp(1rem, .95rem + .28vw, 1.15rem); line-height: 1.75; }
.tyb-meet5 .tyb-prose p { margin: 0; }
/* Badges: a hairline list, not two filled discs. */
.tyb-meet5__badges { grid-template-columns: minmax(0, 1fr); gap: 0; margin: 1.9rem 0 .6rem; max-width: 30rem; border-bottom: 1px solid var(--tyb-line); }
.tyb-meet5__badges li { align-items: center; padding: .85rem 0; border-top: 1px solid var(--tyb-line); font-weight: 500; font-size: .95rem; }
/* No check icons: the hairlines do the listing. */
.tyb-meet5__badges .tyb-li { display: none; }

@media (max-width: 900px) {
	.tyb-meet5 .tyb-split { grid-template-columns: minmax(0, 1fr); gap: 2.25rem; }
	.tyb-meet5 .tyb-split__media--portrait { max-width: 19rem; margin-inline: auto; }
	.tyb-meet5__media img { box-shadow: 10px 10px 0 0 var(--tyb-gold); }
}
@media (max-width: 640px) {
	.tyb-meet5 .tyb-split__media--portrait { max-width: 15.5rem; }
	.tyb-meet5__firm { margin-bottom: 1.1rem; }
	.tyb-meet5 .tyb-prose { line-height: 1.6; }
	.tyb-meet5__badges { margin-top: 1.3rem; }
	.tyb-meet5 .tyb-split__body .tyb-btn { margin-top: 1.1rem; width: 100%; }
}

/* ------------------------------------------------------------ S5 reviews -- */

.tyb-rev5__grid {
	display: grid;
	grid-template-columns: minmax(0, .62fr) minmax(0, 1.38fr);
	grid-template-rows: auto 1fr;
	column-gap: clamp(2.5rem, 7vw, 7rem);
	align-items: start;
}
.tyb-rev5__head { grid-column: 1; grid-row: 1; }
.tyb-rev5__body { grid-column: 2; grid-row: 1 / span 2; }
.tyb-rev5 .tyb-rev5__all { grid-column: 1; grid-row: 2; }
.tyb-rev5__total { display: block; }
.tyb-rev5__total strong {
	display: block;
	font-family: var(--tyb-display);
	font-weight: 400;
	font-size: clamp(5.5rem, 3rem + 9vw, 10.5rem);
	line-height: .82;
	letter-spacing: -.045em;
	color: var(--tyb-brand);
}
.tyb-rev5__total span {
	display: block;
	margin-top: 1.1rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .26em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}
.tyb-rev5__head .tyb-quote__stars { margin: .9rem 0 0; font-size: .95rem; letter-spacing: .3em; }
.tyb-rev5 .tyb-rev5__all { margin-top: 2.25rem; text-align: left; }
.tyb-rev5 .tyb-rev5__all .tyb-btn { border-color: var(--tyb-ink); color: var(--tyb-ink); }
.tyb-rev5 .tyb-rev5__all .tyb-btn:hover { background: var(--tyb-ink); border-color: var(--tyb-ink); color: #fff; }

.tyb-rev5__lead, .tyb-rev5__card { margin: 0; display: flex; flex-direction: column; align-items: flex-start; }
.tyb-rev5__lead blockquote {
	margin: 0 0 1.4rem;
	font-family: var(--tyb-display);
	font-size: clamp(1.5rem, 1.1rem + 1.2vw, 2rem);
	line-height: 1.3;
	letter-spacing: -.01em;
	color: var(--tyb-ink);
}
.tyb-rev5__lead blockquote::before { content: '\201C'; }
.tyb-rev5__lead blockquote::after { content: '\201D'; }
html.tyb-clamp .tyb-rev5__lead .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 4; line-clamp: 4; }
.tyb-rev5__rest {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: clamp(1.5rem, 4vw, 3.5rem);
	margin-top: 2.25rem;
	padding-top: 2rem;
	border-top: 1px solid var(--tyb-line);
}
.tyb-rev5__card blockquote { margin: 0 0 1.1rem; font-size: 1rem; line-height: 1.7; color: var(--tyb-body); }
html.tyb-clamp .tyb-rev5__card .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 3; line-clamp: 3; }
.tyb-rev5 figcaption { display: flex; flex-direction: column; gap: .3rem; margin-top: auto; }
.tyb-rev5 .tyb-quote__name { font-family: var(--tyb-display); font-size: 1.15rem; color: var(--tyb-ink); }
.tyb-rev5 .tyb-quote__via { font-size: .6875rem; font-weight: 600; letter-spacing: .18em; text-transform: uppercase; color: var(--tyb-muted); }
.tyb-rev5 .tyb-rev4__more { margin: -.5rem 0 1.1rem; }

@media (max-width: 900px) {
	/* One column: the total, the reviews, then the button. */
	.tyb-rev5__grid { grid-template-columns: minmax(0, 1fr); grid-template-rows: none; row-gap: 1.6rem; }
	.tyb-rev5__head, .tyb-rev5__body, .tyb-rev5 .tyb-rev5__all { grid-column: 1; grid-row: auto; }
	.tyb-rev5__head { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 1.1rem; align-items: center; }
	.tyb-rev5__head .tyb-kick5 { grid-column: 1 / -1; }
	.tyb-rev5__total { display: contents; }
	.tyb-rev5__total strong { grid-column: 1; grid-row: 2 / span 2; font-size: 5.25rem; }
	.tyb-rev5__total span { grid-column: 2; grid-row: 2; margin: 0; align-self: end; }
	.tyb-rev5__head .tyb-quote__stars { grid-column: 2; grid-row: 3; margin: .3rem 0 0; align-self: start; }
	.tyb-rev5 .tyb-rev5__all { margin-top: 0; }
	.tyb-rev5 .tyb-rev5__all .tyb-btn { width: 100%; }
	.tyb-rev5__rest { grid-template-columns: minmax(0, 1fr); gap: 1.4rem; margin-top: 1.5rem; padding-top: 1.5rem; }
	.tyb-rev5__rest .tyb-rev5__card + .tyb-rev5__card { padding-top: 1.4rem; border-top: 1px solid var(--tyb-line); }
	.tyb-rev5__lead blockquote { font-size: 1.5rem; margin-bottom: 1.1rem; }
	html.tyb-clamp .tyb-rev5__lead .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 5; line-clamp: 5; }
	html.tyb-clamp .tyb-rev5__card .tyb-rev4__text:not(.is-open) { -webkit-line-clamp: 3; line-clamp: 3; }
}
@media (max-width: 640px) {
	/* A phone shows the lead review and one more; "Read all reviews" is right below. */
	.tyb-rev5__rest .tyb-rev5__card + .tyb-rev5__card { display: none; }
}

/* ----------------------------------------------------------- S6 listings -- */

.tyb-list5 .tyb-head--split { margin-bottom: clamp(2rem, 4vw, 3.5rem); }
.tyb-list5 .tyb-kick5 { margin-bottom: 1.1rem; }
.tyb-list5 .tyb-slider__btn { width: 3rem; height: 3rem; background: transparent; border-color: var(--tyb-ink); color: var(--tyb-ink); }
.tyb-list5 .tyb-slider__btn:hover { background: var(--tyb-ink); border-color: var(--tyb-ink); color: #fff; }
.tyb-list5 .tyb-slider__btn[disabled], .tyb-list5 .tyb-slider__btn[disabled]:hover { background: transparent; border-color: var(--tyb-line); color: var(--tyb-faint); opacity: 1; }
.tyb-list5 .tyb-slider__controls { gap: .6rem; }
.tyb-list5 .tyb-slider__controls .tyb-btn { margin-left: .9rem; }
.tyb-list5 .tyb-slider__track { scrollbar-width: none; padding: 0; margin-inline: 0; scroll-padding-inline: 0; }
.tyb-list5 .tyb-slider__track::-webkit-scrollbar { display: none; }
@media (min-width: 900px) {
	/* Two large cards and the edge of the third. */
	.tyb-list5 .tyb-slider__track { grid-auto-columns: calc((100% - 4rem) / 2.3); gap: 2rem; }
}
/* The photograph is the card. No border, no plate, no lift. */
.tyb-list5 .tyb-card { background: none; border: 0; border-radius: 0; overflow: visible; }
.tyb-list5 .tyb-card:hover { transform: none; box-shadow: none; }
.tyb-list5 .tyb-card__media { overflow: hidden; border-radius: var(--tyb-radius5); }
.tyb-list5 .tyb-figure--wide { aspect-ratio: 3 / 2; }
.tyb-list5 .tyb-card__media img { transition: transform 1.6s var(--tyb-ease); }
.tyb-list5 .tyb-card:hover .tyb-card__media img { transform: scale(1.05); }
.tyb-list5 .tyb-card__status {
	top: 1rem; left: 1rem;
	padding: .35rem .6rem;
	border-radius: 2px;
	background: rgba(255, 255, 255, .92);
	color: var(--tyb-ink);
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .2em;
}
.tyb-list5 .tyb-card__body {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	column-gap: 1.5rem;
	row-gap: .45rem;
	align-items: baseline;
	padding: 1.2rem 0 0;
}
.tyb-list5 .tyb-card__title { grid-column: 1; grid-row: 1; margin: 0; font-size: clamp(1.3rem, 1.1rem + .7vw, 1.7rem); line-height: 1.1; }
.tyb-list5 .tyb-card__price { grid-column: 2; grid-row: 1; margin: 0; font-size: clamp(1.3rem, 1.1rem + .7vw, 1.7rem); line-height: 1.1; color: var(--tyb-brand); }
.tyb-list5 .tyb-card__addr,
.tyb-list5 .tyb-card__specs {
	margin: 0; padding: 0; border: 0;
	font-size: .6875rem; font-weight: 600; letter-spacing: .18em; text-transform: uppercase;
	color: var(--tyb-muted);
}
.tyb-list5 .tyb-card__addr { grid-column: 1; grid-row: 2; }
.tyb-list5 .tyb-card__specs { grid-column: 2; grid-row: 2; gap: 0; justify-content: flex-end; }
.tyb-list5 .tyb-card__addr .tyb-icon, .tyb-list5 .tyb-card__specs .tyb-icon { display: none; }
.tyb-list5 .tyb-card__specs li + li::before { content: '\00B7'; margin-inline: .55em; }

@media (max-width: 640px) {
	.tyb-list5 .tyb-head--split { margin-bottom: 1.4rem; }
	.tyb-list5 .tyb-slider__btn { width: 2.75rem; height: 2.75rem; }
	.tyb-list5 .tyb-card__body { grid-template-columns: minmax(0, 1fr); row-gap: .3rem; padding-top: .9rem; }
	.tyb-list5 .tyb-card__price { grid-column: 1; grid-row: 1; font-size: 1.5rem; }
	.tyb-list5 .tyb-card__title { grid-row: 2; font-size: 1.3rem; }
	.tyb-list5 .tyb-card__addr { grid-row: 3; margin-top: .2rem; }
	.tyb-list5 .tyb-card__specs { grid-column: 1; grid-row: 4; justify-content: flex-start; }
	.tyb-list5 .tyb-card__addr, .tyb-list5 .tyb-card__specs { letter-spacing: .14em; }
}

/* ---------------------------------------------- S7 where they work: tiles -- */

.tyb-towns5__head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 2rem;
	margin-bottom: clamp(2rem, 4vw, 3.5rem);
}
.tyb-towns5__hint {
	margin: 0 0 .6rem;
	font-size: .6875rem; font-weight: 600; letter-spacing: .22em; text-transform: uppercase;
	color: var(--tyb-muted);
}
.tyb-towns5__grid {
	list-style: none;
	margin: 0; padding: 0;
	display: grid;
	grid-template-columns: repeat(var(--tyb-cols, 4), minmax(0, 1fr));
	gap: clamp(.75rem, 1.6vw, 1.5rem);
}
.tyb-towns5__item { min-width: 0; }
.tyb-tile5--town { aspect-ratio: 3 / 4; }
/* Three towns: wider tiles, so a little shorter than four across. */
.tyb-towns5__grid--n3 .tyb-tile5--town { aspect-ratio: 4 / 5; }
.tyb-tile5--town .tyb-tile5__name { font-size: clamp(1.4rem, 1rem + 1.1vw, 1.9rem); }
.tyb-tile5--town .tyb-tile5__label { gap: .8rem; padding: 0 clamp(.9rem, 1.5vw, 1.4rem) clamp(1rem, 1.5vw, 1.35rem); }
.tyb-tile5--town .tyb-arrow5 { width: 22px; }
/* A shallow top scrim, so the white outline holds on a bright sky. */
.tyb-tile5--town::before {
	content: '';
	position: absolute; inset: 0 0 auto 0;
	height: 34%;
	z-index: -1;
	background: linear-gradient(to bottom, rgba(var(--tyb-scrim5), .42) 0%, rgba(var(--tyb-scrim5), 0) 100%);
}
/* The town's outline: small, white line, top left of the photograph. */
.tyb-tile5__shape {
	position: absolute;
	top: clamp(.9rem, 1.5vw, 1.35rem); left: clamp(.9rem, 1.5vw, 1.4rem);
	width: 64px; height: 64px;
	transition: transform .6s var(--tyb-ease);
}
.tyb-tile5__shape .tyb-shape { width: 100%; height: 100%; overflow: visible; }
.tyb-tile5__shape .tyb-shape path {
	fill: rgba(255, 255, 255, .22);
	stroke: #fff;
	stroke-width: 1.5;
	stroke-linejoin: round;
	vector-effect: non-scaling-stroke;
}
/* No photograph: a brand-color tile with the outline large. Same label,
   same arrow, so a row can mix both and still read as one set. */
.tyb-tile5--plain { background: linear-gradient(160deg, var(--tyb-brand-mid) 0%, var(--tyb-deep) 70%); }
.tyb-tile5--plain::before, .tyb-tile5--plain::after { content: none; }
.tyb-tile5--plain .tyb-tile5__shape {
	top: 11%; left: 16%;
	width: 68%; height: auto;
	aspect-ratio: 1 / 1;
}
.tyb-tile5--plain .tyb-tile5__shape .tyb-shape path { fill: rgba(255, 255, 255, .1); stroke-width: 1.4; }
@media (hover: hover) {
	.tyb-tile5--plain:hover .tyb-tile5__shape { transform: scale(1.05); }
}

@media (max-width: 1040px) {
	.tyb-towns5__grid { grid-template-columns: repeat(var(--tyb-cols-md, 3), minmax(0, 1fr)); }
	/* Narrow tiles: the name alone, so a two-word town stays on one line. */
	.tyb-tile5--town .tyb-tile5__line, .tyb-tile5--town .tyb-arrow5 { display: none; }
}
@media (max-width: 780px) {
	.tyb-towns5__grid { grid-template-columns: repeat(var(--tyb-cols-sm, 2), minmax(0, 1fr)); gap: .7rem; }
	.tyb-towns5__head { flex-direction: column; align-items: flex-start; gap: .9rem; margin-bottom: 1.4rem; }
	.tyb-towns5__hint { margin: 0; letter-spacing: .16em; }
	.tyb-tile5--town, .tyb-towns5__grid--n3 .tyb-tile5--town { aspect-ratio: 4 / 5; }
	/* An odd count on two columns: the last town takes the full row, wide. */
	.tyb-towns5__item:last-child:nth-child(odd) { grid-column: 1 / -1; }
	.tyb-towns5__item:last-child:nth-child(odd) .tyb-tile5--town { aspect-ratio: 2 / 1; }
	.tyb-towns5__item:last-child:nth-child(odd) .tyb-tile5--plain .tyb-tile5__shape { top: 9%; left: 50%; width: auto; height: 58%; transform: translateX(-50%); }
	.tyb-tile5--town .tyb-tile5__name { font-size: 1.5rem; }
	.tyb-tile5--town .tyb-tile5__line, .tyb-tile5--town .tyb-arrow5 { display: none; }
	.tyb-tile5--town .tyb-tile5__label { padding: 0 .85rem .8rem; }
	.tyb-tile5__shape { top: .75rem; left: .8rem; width: 44px; height: 44px; }
}

/* -------------------------------- S8 their words, over a photograph -- */

.tyb-creed5 { position: relative; isolation: isolate; overflow: hidden; }
.tyb-creed5 .tyb-kick5 { justify-content: center; }
.tyb-creed5 .tyb-kick5::after { content: ''; flex: none; width: 32px; height: 2px; background: var(--tyb-rule4); }
.tyb-creed5 .tyb-creed__inner { max-width: 60rem; }
.tyb-creed5 .tyb-creed__goal {
	margin: 0 auto;
	max-width: 24ch;
	font-size: clamp(1.9rem, 1.2rem + 2.9vw, 3.6rem);
	line-height: 1.1;
	letter-spacing: -.02em;
	text-wrap: balance;
}
.tyb-creed5 .tyb-creed__goal::before { content: '\201C'; }
.tyb-creed5 .tyb-creed__goal::after { content: '\201D'; }
.tyb-creed5 .tyb-creed__attrib {
	margin-top: 1.75rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem; font-weight: 600; letter-spacing: .24em;
}
.tyb-creed5 .tyb-creed__actions { margin-top: 2.5rem; align-items: center; gap: 1rem 1.75rem; }

.tyb-creed5--photo { padding-block: clamp(5rem, 11vw, 10rem); background: var(--tyb-deep); border: 0; }
.tyb-creed5__img { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; }
.tyb-creed5--photo::before {
	/* .tyb-section--dark::before is the 4px shore rule (height: 4px): take the
	   whole box back for the scrim, and drop the rule at the bottom edge. */
	top: 0; bottom: 0; height: auto;
	z-index: -1;
	background: rgba(var(--tyb-scrim5), var(--tyb-scrim-creed, .46));
}
.tyb-creed5--photo::after { content: none; }
.tyb-creed5--photo .tyb-creed__inner { text-shadow: 0 1px 18px rgba(var(--tyb-scrim5), .4); }
.tyb-creed5--photo .tyb-kick5,
.tyb-creed5--photo .tyb-creed__goal,
.tyb-creed5--photo .tyb-creed__attrib,
.tyb-creed5--photo .tyb-creed__call,
.tyb-creed5--photo .tyb-creed__call:hover,
.tyb-creed5--photo .tyb-creed__call strong,
.tyb-creed5--photo .tyb-creed__call .tyb-icon { color: #fff; }
.tyb-creed5--photo .tyb-btn { text-shadow: none; }

@media (max-width: 640px) {
	.tyb-creed5--photo { padding-block: 3.5rem; }
	.tyb-creed5 .tyb-creed__goal { font-size: 1.95rem; }
	.tyb-creed5 .tyb-creed__attrib { margin-top: 1.2rem; letter-spacing: .16em; }
	.tyb-creed5 .tyb-creed__actions { margin-top: 1.75rem; }
	.tyb-creed5--photo .tyb-creed__call-num { border-color: #fff; background: rgba(var(--tyb-scrim5), .28); }
}

/* --------------------------------------- S9 the one client-only section -- */

.tyb-spec5__grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: clamp(2rem, 5vw, 4rem);
}
.tyb-spec5--photo .tyb-spec5__grid {
	grid-template-columns: minmax(0, 1fr) minmax(0, .82fr);
	gap: clamp(3rem, 8vw, 8rem);
	align-items: center;
}
.tyb-spec5__intro .tyb-h5 { max-width: 16ch; }
.tyb-spec5__list { list-style: none; margin: clamp(1.75rem, 3.5vw, 2.75rem) 0 0; padding: 0; border-bottom: 1px solid var(--tyb-line); }
.tyb-spec5__item {
	display: grid;
	grid-template-columns: minmax(0, .8fr) minmax(0, 1fr);
	column-gap: 2rem;
	align-items: baseline;
	padding: 1.3rem 0;
	border-top: 1px solid var(--tyb-line);
}
.tyb-spec5__title { font-size: clamp(1.3rem, 1.1rem + .7vw, 1.65rem); line-height: 1.12; }
.tyb-spec5__text { margin: 0; font-size: .98rem; line-height: 1.6; color: var(--tyb-body); }
.tyb-spec5__body > .tyb-btn { margin-top: 2rem; }
.tyb-spec5__media { margin: 0; overflow: hidden; border-radius: var(--tyb-radius5); aspect-ratio: 1 / 1; background: var(--tyb-tint-2); }
.tyb-spec5__media img { width: 100%; height: 100%; object-fit: cover; }
/* No photograph: the heading takes the left column and the list the right. */
@media (min-width: 901px) {
	.tyb-spec5:not(.tyb-spec5--photo) .tyb-spec5__body {
		display: grid;
		grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr);
		column-gap: clamp(3rem, 8vw, 8rem);
		align-items: start;
	}
	.tyb-spec5:not(.tyb-spec5--photo) .tyb-spec5__list { grid-column: 2; grid-row: 1 / span 2; margin-top: 0; }
	.tyb-spec5:not(.tyb-spec5--photo) .tyb-spec5__body > .tyb-btn { grid-column: 1; grid-row: 2; justify-self: start; }
}
@media (max-width: 900px) {
	.tyb-spec5--photo .tyb-spec5__grid { grid-template-columns: minmax(0, 1fr); gap: 1.75rem; }
	.tyb-spec5__media { order: -1; aspect-ratio: 16 / 10; }
}
@media (max-width: 640px) {
	.tyb-spec5__item { grid-template-columns: minmax(0, 1fr); row-gap: .3rem; padding: 1rem 0; }
	.tyb-spec5__list { margin-top: 1.3rem; }
	.tyb-spec5__body > .tyb-btn { margin-top: 1.4rem; width: 100%; }
	.tyb-spec5__media { aspect-ratio: 16 / 9; }
}

/* ------------------------------------ S10 the lead band, closes the page -- */

.tyb-lead5 {
	position: relative;
	isolation: isolate;
	overflow: hidden;
	padding-block: clamp(4.5rem, 8.5vw, 8rem);
	background: linear-gradient(168deg, var(--tyb-surf-pale) 0%, var(--tyb-shell) 52%, var(--tyb-sand) 100%);
	color: var(--tyb-body);
}
.tyb-lead5__img { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; }
.tyb-lead5--photo { background: var(--tyb-deep); color: #fff; }
/* A soft pool of scrim behind the words only. The top, the bottom and the
   side behind the card stay close to the photograph as shot. */
.tyb-lead5--photo::before {
	content: '';
	position: absolute; inset: 0;
	z-index: -1;
	background: radial-gradient(ellipse 64% 72% at 18% 55%,
		rgba(var(--tyb-scrim5), var(--tyb-scrim-lead, .6)) 0%,
		rgba(var(--tyb-scrim5), var(--tyb-scrim-lead, .6)) 46%,
		rgba(var(--tyb-scrim5), calc(var(--tyb-scrim-lead, .6) * .25)) 100%);
}
.tyb-lead5__grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 30rem);
	gap: clamp(2.5rem, 7vw, 7rem);
	align-items: center;
}
.tyb-lead5__title { max-width: none; font-size: clamp(2.6rem, 1.5rem + 4.2vw, 5rem); line-height: .98; }
.tyb-lead5__text { margin: 1.4rem 0 0; max-width: 30ch; font-size: clamp(1.05rem, 1rem + .35vw, 1.3rem); line-height: 1.55; }
.tyb-lead5__call {
	display: inline-flex;
	align-items: center;
	gap: .7rem;
	margin-top: 2.1rem;
	padding-block: .35rem;
	font-family: var(--tyb-display);
	font-size: clamp(1.9rem, 1.4rem + 1.8vw, 2.9rem);
	line-height: 1;
	letter-spacing: -.01em;
	color: var(--tyb-brand);
	border-bottom: 1px solid currentColor;
}
.tyb-lead5__call .tyb-icon { width: .55em; height: .55em; }
.tyb-lead5__call:hover { color: var(--tyb-ink); }
.tyb-lead5 .tyb-lead5__firm { margin-top: 1rem; font-size: .6875rem; font-weight: 600; letter-spacing: .22em; text-transform: uppercase; color: var(--tyb-muted); }
.tyb-lead5--photo .tyb-lead5__copy { text-shadow: 0 1px 22px rgba(var(--tyb-scrim5), .55); }
.tyb-lead5--photo .tyb-kick5,
.tyb-lead5--photo .tyb-lead5__title,
.tyb-lead5--photo .tyb-lead5__text,
.tyb-lead5--photo .tyb-lead5__call,
.tyb-lead5--photo .tyb-lead5__call:hover,
.tyb-lead5--photo .tyb-lead5__call .tyb-icon,
.tyb-lead5--photo .tyb-lead5__firm { color: #fff; }
.tyb-lead5--photo .tyb-lead5__call:hover { border-bottom-width: 2px; }

.tyb-lead5__card {
	scroll-margin-top: calc(var(--tyb-header-h, 4.5rem) + 1rem);
	padding: clamp(1.4rem, 3vw, 2.5rem);
	background: #fff;
	border-radius: 8px;
	box-shadow: 0 30px 70px -30px rgba(var(--tyb-scrim5), .55);
	color: var(--tyb-body);
}
.tyb-lead5__card-title { margin-bottom: 1.2rem; font-size: clamp(1.5rem, 1.3rem + .8vw, 1.9rem); }
.tyb-lead5__card .tyb-field textarea { height: 5.4rem; min-height: 0; }

@media (max-width: 900px) {
	.tyb-lead5__grid { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
	.tyb-lead5--photo::before { background: rgba(var(--tyb-scrim5), var(--tyb-scrim-lead, .58)); }
}
@media (max-width: 640px) {
	.tyb-lead5 { padding-block: 2.75rem; }
	.tyb-lead5__text { margin-top: .9rem; }
	.tyb-lead5__call { margin-top: 1.3rem; font-size: 2rem; }
	.tyb-lead5__card .tyb-form { gap: .65rem; }
	.tyb-lead5__card .tyb-field { gap: .25rem; }
	.tyb-lead5__card .tyb-field__row { gap: .65rem; }
	.tyb-lead5__card-title { margin-bottom: .8rem; }
	.tyb-lead5__card .tyb-field textarea { height: 4.6rem; }
	/* The photograph sits behind the words only (a 4:5 phone crop), and fades
	   into the band's solid ground before the form card, which would hide it. */
	.tyb-lead5--photo .tyb-lead5__img {
		inset: 0 0 auto 0;
		height: 30rem;
		-webkit-mask-image: linear-gradient(#000 66%, transparent);
		mask-image: linear-gradient(#000 66%, transparent);
	}
	.tyb-lead5--photo::before { bottom: auto; height: 30rem; -webkit-mask-image: linear-gradient(#000 66%, transparent); mask-image: linear-gradient(#000 66%, transparent); }
}

/* Desktop: the call pill sits over the right edge of the form card below
   about 1500px wide. theme.js already marks it .is-hidden over a form, the
   hero, the creed and the footer; until now only the phone layout acted on
   that. Each of those zones prints the number itself. */
@media (min-width: 901px) {
	.tyb-callbar { transition: opacity .25s var(--tyb-ease), visibility 0s linear 0s; }
	.tyb-callbar.is-hidden { opacity: 0; visibility: hidden; pointer-events: none; transition: opacity .25s var(--tyb-ease), visibility 0s linear .25s; }

	/* Desktop: the header already carries the contact button, and a full pill
	   sat on the tile labels. It rests as the round face-and-phone button and
	   opens to the full pill on hover or keyboard focus. */
	.tyb-callbar { right: 1.5rem; bottom: calc(1.5rem + env(safe-area-inset-bottom, 0px)); }
	.tyb-callbar__call { gap: 0; padding: .4rem; transition: transform .22s var(--tyb-ease), box-shadow .22s var(--tyb-ease), padding .3s var(--tyb-ease), gap .3s var(--tyb-ease); }
	.tyb-callbar__call::after { opacity: 0; transition: opacity .2s var(--tyb-ease); }
	.tyb-callbar__txt { max-width: 0; opacity: 0; overflow: hidden; white-space: nowrap; transition: max-width .35s var(--tyb-ease), opacity .2s var(--tyb-ease); }
	.tyb-callbar__call:hover, .tyb-callbar__call:focus-visible { gap: .7rem; padding: .7rem 1.15rem .8rem .7rem; }
	.tyb-callbar__call:hover::after, .tyb-callbar__call:focus-visible::after { opacity: 1; }
	.tyb-callbar__call:hover .tyb-callbar__txt, .tyb-callbar__call:focus-visible .tyb-callbar__txt { max-width: 16rem; opacity: 1; }
}

/* Phones: headings use the full column and balance their lines. */
@media (max-width: 640px) {
	.tyb-h5, .tyb-intro5__head .tyb-h5, .tyb-spec5__intro .tyb-h5 { max-width: none; }
	.tyb-kick5 { letter-spacing: .2em; gap: .7rem; }
}

/* The footer address measured 4.34:1; it takes its neighbors' text color. */
.tyb-foot__addr { color: rgba(255, 255, 255, .72); }

@media (prefers-reduced-motion: reduce) {
	.tyb-tile5, .tyb-tile5__img, .tyb-tile5__shape, .tyb-arrow5, .tyb-list5 .tyb-card__media img,
	.tyb-callbar__call, .tyb-callbar__txt { transition: none; }
	.tyb-tile5:hover .tyb-tile5__img, .tyb-tile5:focus-visible .tyb-tile5__img,
	.tyb-list5 .tyb-card:hover .tyb-card__media img { transform: none; }
}

/* ------------------------------------------------------------------------
   Added when the mock became PHP (same block, same date). States the static
   mock did not have: a route, one or two towns, one or two reviews, a figure
   band with no heading, a plain reviews heading, the form's own anchor, and
   a firm whose casing must be kept.
   ------------------------------------------------------------------------ */

/* S3: no kicker and no heading, so the row of figures starts the band. */
.tyb-nums5__list:first-child { margin-top: 0; }

/* S5: under five reviews the heading is words, not a count. */
.tyb-rev5__plain { max-width: 12ch; font-size: clamp(2rem, 1.3rem + 2.2vw, 3rem); }
/* S5: two reviews in all, so one sits under the lead: full width. */
.tyb-rev5__rest--one { grid-template-columns: minmax(0, 1fr); }
@media (max-width: 900px) {
	.tyb-rev5__plain { grid-column: 1 / -1; max-width: none; }
	.tyb-rev5__head .tyb-rev5__plain ~ .tyb-quote__stars { grid-column: 1 / -1; grid-row: auto; }
}

/* S7: the ROUTE prints the same tiles in named legs, each under a hairline. */
.tyb-towns5__leg {
	display: flex;
	align-items: baseline;
	gap: 1.25rem;
	margin: clamp(2rem, 4vw, 3.25rem) 0 1.1rem;
	padding-top: 1.1rem;
	border-top: 1px solid var(--tyb-line);
}
.tyb-towns5__head + .tyb-towns5__leg { margin-top: 0; }
.tyb-towns5__leg-name { font-size: clamp(1.4rem, 1.1rem + 1vw, 1.9rem); line-height: 1.1; }
.tyb-towns5__leg-note {
	margin: 0;
	font-size: .6875rem; font-weight: 600; letter-spacing: .2em; text-transform: uppercase;
	color: var(--tyb-muted);
}
/* The client's complete logo above a route (assets/img/logo-full.*). */
.tyb-towns5__logo { display: block; width: auto; height: auto; max-width: min(100%, 22rem); max-height: 7rem; margin: 0 0 2rem; }
/* S7: one or two towns. Wide tiles, and a plain tile's outline centered in
   them (the SVG centers its own drawing: preserveAspectRatio xMidYMid). */
@media (min-width: 781px) {
	.tyb-towns5__grid--n2 .tyb-tile5--town { aspect-ratio: 3 / 2; }
	.tyb-towns5__grid--n1 .tyb-tile5--town { aspect-ratio: 5 / 2; }
	.tyb-towns5__grid--n2 .tyb-tile5--plain .tyb-tile5__shape,
	.tyb-towns5__grid--n1 .tyb-tile5--plain .tyb-tile5__shape { top: 9%; left: 0; right: 0; width: auto; height: 58%; aspect-ratio: auto; }
}
@media (max-width: 780px) {
	.tyb-towns5__leg { flex-direction: column; gap: .35rem; margin: 1.6rem 0 .9rem; padding-top: .9rem; }
	.tyb-towns5__leg-note { letter-spacing: .14em; }
}

/* S9, no photograph: the note sits under the button, in the left column. */
@media (min-width: 901px) {
	.tyb-spec5:not(.tyb-spec5--photo) .tyb-spec5__note { grid-column: 1; }
}

/* S10: with JavaScript off the handler redirects to #tyb-form, which is the
   form's wrapper inside the card (trap 76). It has to clear the sticky header
   and show the card's heading above it. */
.tyb-lead5__form { scroll-margin-top: calc(var(--tyb-header-h, 4.5rem) + 5rem); }

/* A firm whose brand casing must survive capitals (eXp): profile()['firm_case']
   adds .tyb-firmcase to <body>, and the three small capital lines that can
   carry the firm print as typed. .tyb-nocase does the same for one span. */
.tyb-nocase { text-transform: none; }
.tyb-firmcase .tyb-meet5 .tyb-meet5__firm,
.tyb-firmcase .tyb-lead5 .tyb-lead5__firm,
.tyb-firmcase .tyb-creed5 .tyb-creed__attrib { text-transform: none; letter-spacing: .06em; font-size: .8rem; }

/* TEST SITE 2026-10-04 (found on demotemplate.brokerboost.com, the first real
   render). The resting desktop pill is meant to be ROUND, but its hidden text
   column (max-width 0) still had three lines of height, so the button was as
   tall as the open pill: 59x60 with a face and a 50x60 egg with no face (the
   phone-glyph fallback). At rest the text column takes no height either. */
@media (min-width: 901px) {
	.tyb-callbar__call:not(:hover):not(:focus-visible) .tyb-callbar__txt { height: 0; }
}

/* TEST SITE 2026-10-04. The no-face pill (no callbar-face.jpg) is a phone glyph
   on a colored disc. The disc sets color #fff, but the glyph is a .tyb-icon,
   which carries its own light accent color, so it was drawn pale blue on the
   disc. Trap 6: the fallback no site with a headshot ever renders. */
.tyb-callbar__ico:not(.tyb-callbar__ico--face) .tyb-icon { color: #fff; }

/* REVIEW 2026-10-04. A town count that does not fill its last row (5, 7, 10,
   11) left that row at the left with a hole beside it. On desktop the short
   last row is centered: twice the tracks, every tile spans two, and the first
   tile of the last row starts at --tyb-off (parts/markets.php sets both). The
   tile width is unchanged. Under 1041px the two- and three-column rules above
   apply as before. */
@media (min-width: 1041px) {
	.tyb-towns5__grid--center { grid-template-columns: repeat(calc(var(--tyb-cols, 4) * 2), minmax(0, 1fr)); }
	.tyb-towns5__grid--center > .tyb-towns5__item { grid-column: span 2; }
	.tyb-towns5__grid--center > .tyb-towns5__item--lead { grid-column: var(--tyb-off, auto) / span 2; }
}

/* ------------------------------------------------------------------------
   REVIEW FIXES 2026-10-04 (two reviewers, the live test site). Same block,
   same date. Every rule below is an override of an older rule or of a rule
   earlier in this block, and wins by coming later (trap 51).
   ------------------------------------------------------------------------ */

/* INNER PAGES take the home page's grammar. They were still the round-2
   look: a condensed-serif eyebrow, the four-color rule under every heading,
   smaller headings and a boxed "Start here" panel. */

/* The banner's words start where the logo and the page content start. The
   max-width was on the wrap itself, so the wrap centered and the title began
   192px to the right of the logo at 1440. */
.tyb-banner__inner { max-width: var(--tyb-wrap); text-shadow: 0 1px 22px rgba(var(--tyb-scrim5), .55); }
.tyb-banner__inner > * { max-width: 46rem; }

/* The banner scrim: a pool in the neutral, under the words (bottom left),
   fading to nothing toward the top right. The old one washed the whole
   photograph grey-green from two directions. Strength is one number,
   --tyb-scrim-banner, MEASURED on the test site's five banner photographs
   with the text hidden, brightest 1% of the ground: at .55 the lowest small
   text reads about 4.7:1 on the two bright interiors. A plain bottom-up
   gradient (.62 to .08) was tried first and failed the kicker at 2.7:1. A
   phone's words run the full width, so there the scrim is bottom-up. */
.tyb-banner__scrim {
	background:
		radial-gradient(ellipse 115% 150% at 0% 100%,
			rgba(var(--tyb-scrim5), var(--tyb-scrim-banner, .55)) 0%,
			rgba(var(--tyb-scrim5), var(--tyb-scrim-banner, .55)) 55%,
			rgba(var(--tyb-scrim5), 0) 100%),
		linear-gradient(to top, rgba(var(--tyb-scrim5), .2), rgba(var(--tyb-scrim5), 0) 70%);
}
@media (max-width: 900px) {
	.tyb-banner__scrim {
		background: linear-gradient(to top,
			rgba(var(--tyb-scrim5), calc(var(--tyb-scrim-banner, .55) + .05)) 0%,
			rgba(var(--tyb-scrim5), calc(var(--tyb-scrim-banner, .55) + .05)) 78%,
			rgba(var(--tyb-scrim5), calc(var(--tyb-scrim-banner, .55) - .13)) 100%);
	}
}
.tyb-banner__lede { color: #fff; }

/* The old eyebrow becomes the kicker: tiny tracked sans capitals with the
   small four-color rule before it. (The home page prints .tyb-kick5 itself;
   this reaches the inner templates without touching each one.) */
.tyb-banner .tyb-eyebrow,
.tyb-section .tyb-eyebrow {
	display: inline-flex;
	align-items: center;
	gap: .85rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	line-height: 1.4;
	letter-spacing: .26em;
	text-transform: uppercase;
}
.tyb-banner .tyb-eyebrow::before,
.tyb-section .tyb-eyebrow::before {
	content: '';
	flex: none;
	width: 32px; height: 2px;
	background: var(--tyb-rule4);
}
/* The rule under a heading goes: the kicker carries the four colors now.
   What followed the rule keeps the space the rule gave it. */
.tyb-banner .tyb-rule,
.tyb-section :is(h1, h2) + .tyb-rule { display: none; }
.tyb-banner .tyb-rule + *,
.tyb-section :is(h1, h2) + .tyb-rule + * { margin-top: 1.15rem; }

/* Inner section headings at the home page's size. */
.tyb-head h2:not(.tyb-h5),
.tyb-valuecta h2 {
	font-size: clamp(2rem, 1.3rem + 2.2vw, 3rem);
	line-height: 1.06;
	letter-spacing: -.02em;
}

/* "Start here" on the buyer and seller pages: no box, no fill, no stripe.
   Two hairlines, like the home page's lists. */
.tyb-valuecta {
	padding-inline: 0;
	background: transparent;
	border: 0;
	border-top: 1px solid var(--tyb-line);
	border-bottom: 1px solid var(--tyb-line);
	border-radius: 0;
	box-shadow: none;
}

/* S2 with NO tile photographs. Three 376px squares of solid dark color read
   as three images that failed to load. A tile with no <img> is a short label
   bar on the brand gradient. The item is a grid so that, in a row that mixes
   both, the plain tile still fills the row beside a photograph. */
.tyb-tiles5__item { display: grid; }
.tyb-tiles5 .tyb-tile5:not(:has(.tyb-tile5__img)) {
	aspect-ratio: auto;
	min-height: 7.5rem;
	background: linear-gradient(160deg, var(--tyb-brand-mid) 0%, var(--tyb-deep) 70%);
}
.tyb-tiles5 .tyb-tile5:not(:has(.tyb-tile5__img))::before,
.tyb-tiles5 .tyb-tile5:not(:has(.tyb-tile5__img))::after { content: none; }
@media (max-width: 640px) {
	.tyb-tiles5 .tyb-tile5:not(:has(.tyb-tile5__img)),
	.tyb-tiles5__item:first-child .tyb-tile5:not(:has(.tyb-tile5__img)) { height: auto; min-height: 5.5rem; }
}

/* S6 on desktop: the row of cards runs off the right edge of the screen, as
   on the reference sites. It used to stop at the content column, slicing the
   third card mid-word with 128px of empty ground beside it. The section
   clips, so nothing scrolls sideways. */
@media (min-width: 901px) {
	.tyb-list5 { overflow-x: clip; }
	.tyb-list5 .tyb-slider__track {
		margin-right: calc(-1 * max(var(--tyb-gutter), (100vw - var(--tyb-wrap)) / 2 + var(--tyb-gutter)));
		padding-right: var(--tyb-gutter);
		scroll-padding-right: var(--tyb-gutter);
	}
}
/* S6 on a phone: every card is as tall as the tallest, and a sold card's
   "Represented the seller" line added a row, leaving about 70px of blank
   ground under a for-sale card. That line now shares the town's row. */
@media (max-width: 640px) {
	.tyb-list5 .tyb-card__body { grid-template-columns: minmax(0, 1fr) auto; column-gap: .75rem; }
	.tyb-list5 .tyb-card__price,
	.tyb-list5 .tyb-card__title,
	.tyb-list5 .tyb-card__specs { grid-column: 1 / -1; }
	.tyb-list5 .tyb-card__addr { grid-column: 1; }
	.tyb-list5 .tyb-card__repd { grid-column: 2; grid-row: 3; align-self: end; margin: 0; white-space: nowrap; }
	.tyb-list5 { padding-bottom: 2rem; }
}

/* S7: the white outline was lost on bright or busy photographs. */
.tyb-tile5--town:not(.tyb-tile5--plain) .tyb-tile5__shape { filter: drop-shadow(0 1px 6px rgba(var(--tyb-scrim5), .55)); }
.tyb-tile5--town:not(.tyb-tile5--plain) .tyb-tile5__shape .tyb-shape path { fill: rgba(255, 255, 255, .3); }

/* S7 from 781 to 1040px: a short last row is centered here too (the desktop
   rule below does it from 1041px). parts/markets.php sets --tyb-off-md on
   the first tile of the last row at this width's column count. */
@media (min-width: 781px) and (max-width: 1040px) {
	.tyb-towns5__grid--center-md { grid-template-columns: repeat(calc(var(--tyb-cols-md, 3) * 2), minmax(0, 1fr)); }
	.tyb-towns5__grid--center-md > .tyb-towns5__item { grid-column: span 2; }
	.tyb-towns5__grid--center-md > .tyb-towns5__item--lead-md { grid-column: var(--tyb-off-md, auto) / span 2; }
}

/* S10 on desktop: the pool of scrim sits on the words and lets the sky go.
   It was an oval 72% of the band tall that never fell below a quarter
   strength, which greyed the sky above the heading and left a soft edge
   beside the form card. Now it is smaller, centered on the copy and fades to
   NOTHING; the top of the band keeps about a third of the old cover. (A
   lower, weaker oval at 16% 64% was measured first and failed the kicker at
   2.2:1 and the heading at 2.3:1: the words start at 31% of the band.) The
   phone rule (a flat scrim under a masked photograph) is unchanged. */
@media (min-width: 901px) {
	.tyb-lead5--photo::before {
		background:
			radial-gradient(ellipse 60% 62% at 20% 50%,
				rgba(var(--tyb-scrim5), var(--tyb-scrim-lead, .6)) 0%,
				rgba(var(--tyb-scrim5), var(--tyb-scrim-lead, .6)) 45%,
				rgba(var(--tyb-scrim5), 0) 100%),
			linear-gradient(to top, rgba(var(--tyb-scrim5), .18), rgba(var(--tyb-scrim5), 0) 55%);
	}
}
/* S10: hover no longer thickens the border (it moved the firm line 1px). */
.tyb-lead5--photo .tyb-lead5__call:hover { border-bottom-width: 1px; box-shadow: 0 1px 0 0 currentColor; }
/* On a photograph the brand-color focus ring is dark on dark. */
.tyb-lead5--photo .tyb-lead5__call:focus-visible,
.tyb-creed5--photo .tyb-creed__call:focus-visible { outline: 2px solid #fff; outline-offset: 4px; }

/* Single listing on a phone: three facts in two columns left an empty fourth
   cell. The last odd fact takes the row. Only where the grid really is two
   columns (a 9rem minimum fits three from about 460px up). */
@media (max-width: 460px) {
	.tyb-facts > :last-child:nth-child(odd) { grid-column: 1 / -1; }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-tile5__line, .tyb-tile5::after { transition: none; }
	.tyb-tile5:hover .tyb-arrow5,
	.tyb-tile5--plain:hover .tyb-tile5__shape,
	.tyb-tile5:active { transform: none; }
}

/* ═════════════════════════ end SLEEK HOME 2026-10-04 ═════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   SIMPLE HERO 2026-10-04
   Round 4. Adam, on the round-3 test site: "hero feels way too jam packed...
   keep only one [call to action] and it looks like the strongest is home
   valuation... take a look at my best heroes and see they have one thing in
   common thats simplicity and great design."

   .tyb-hero6 replaces .tyb-hero3 (whose rules above are now dead and are left
   in place on purpose). The hero is a kicker, the H1, one optional sentence
   and ONE action. This block also holds the light figures strip that sits
   under the hero (the order is data now: TYB_Content::home_order()), the
   listings-row scroll fix (B1) and the filled-icon alignment (H6).

   Three compositions were drawn and judged (tmp/audit-20261004/round4/hero/).
   This is A: copy on the left with the bar under it, and on a phone the copy
   sits low so the top of the photograph stays clear. B (centered) and C (copy
   low, bar at the right) were not carried into the sheet.

   A scrim belongs to its photographs. The values below were measured on the
   test site's three frames at 1440 and 390. Re-measure on every build, in
   both directions (trap 111). A build's own overrides go BELOW this block.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-hero6 {
	display: flex; align-items: stretch;
	padding-block: 0;
	min-height: clamp(36rem, 82vh, 47rem);
	background: var(--tyb-deep);
}
.tyb-hero6 > .tyb-wrap { position: relative; z-index: 2; width: 100%; display: flex; align-items: center; }

/* The masthead is drawn over the hero in the transparent mode: the hero
   reserves its height once, here. (.tyb-home .tyb-hero__inner reserves it a
   second time further up the sheet; the three-class rule below replaces that
   at every width.) */
.tyb-mast--transparent.tyb-home .tyb-hero6 { padding-top: var(--tyb-header-h); }
html:not(.js) .tyb-mast--transparent.tyb-home .tyb-hero6 { padding-top: 0; }
.tyb-hero6.tyb-hero6--a .tyb-hero__inner {
	max-width: none; width: 100%;
	padding-block: clamp(2.5rem, 6.5vh, 4rem) clamp(3rem, 8.5vh, 5.25rem);
}
/* Light and dark mastheads are in the flow above the hero, so the hero gives
   that height back and still ends inside the first screen. */
.tyb-mast--light .tyb-hero6, .tyb-mast--dark .tyb-hero6 { min-height: clamp(30rem, calc(82vh - var(--tyb-header-h) - 2.5rem), 44rem); }

/* ONE wash for the masthead, owned by the hero. It used to be two (one on the
   bar, one continuing below it) and they met in a visible hairline at the
   bar's bottom edge on a bright sky. The bar keeps only the white layer that
   arrives on scroll. The hero's own scrim is masked down under the masthead
   so the two do not stack into a dark lid over the top of the photograph. */
.tyb-mast--transparent.tyb-home .tyb-hero6::before {
	content: ''; position: absolute; z-index: 1; left: 0; right: 0; top: 0;
	height: calc(var(--tyb-header-h) + 7rem); pointer-events: none;
	background: linear-gradient(to bottom,
		rgba(16, 18, 22, .56) 0,
		rgba(16, 18, 22, .46) calc(var(--tyb-header-h) * .7),
		rgba(16, 18, 22, .24) var(--tyb-header-h),
		rgba(16, 18, 22, .1) calc(var(--tyb-header-h) + 3rem),
		rgba(16, 18, 22, 0) 100%);
}
.tyb-mast--transparent.tyb-home .tyb-header__bar {
	/* The second layer is a shade that exists only WHILE the bar is arriving
	   (nothing at rest, nothing once it is white), so the white nav still reads
	   in the few pixels of scroll before it turns dark. */
	background:
		linear-gradient(rgba(255, 255, 255, var(--tyb-shrink)), rgba(255, 255, 255, var(--tyb-shrink))),
		linear-gradient(rgba(16, 18, 22, calc(1.6 * var(--tyb-shrink) * (1 - var(--tyb-shrink)))), rgba(16, 18, 22, calc(1.6 * var(--tyb-shrink) * (1 - var(--tyb-shrink)))));
	border-bottom-color: rgba(228, 222, 210, var(--tyb-shrink));
}
.tyb-mast--transparent.tyb-home .tyb-hero6 .tyb-hero__scrim {
	-webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, .22) 0, rgba(0, 0, 0, .22) calc(var(--tyb-header-h) * .7), #000 calc(var(--tyb-header-h) + 2.5rem));
	mask-image: linear-gradient(to bottom, rgba(0, 0, 0, .22) 0, rgba(0, 0, 0, .22) calc(var(--tyb-header-h) * .7), #000 calc(var(--tyb-header-h) + 2.5rem));
}

/* The scrim: a neutral shade under the copy column that is gone before the
   middle of the photograph, and almost nothing top to bottom. */
.tyb-hero6 .tyb-hero__scrim {
	background:
		linear-gradient(to right, rgba(12, 18, 22, .62) 0%, rgba(12, 18, 22, .58) 34%, rgba(12, 18, 22, .38) 50%, rgba(12, 18, 22, .12) 66%, rgba(12, 18, 22, 0) 82%),
		linear-gradient(to bottom, rgba(12, 18, 22, .1) 0%, rgba(12, 18, 22, 0) 36%, rgba(12, 18, 22, .12) 70%, rgba(12, 18, 22, .12) 100%);
}

.tyb-hero6__copy { max-width: 40rem; }

/* Kicker: the page's small tracked capitals, white, behind a short rule. */
.tyb-hero6__kicker {
	display: flex; align-items: center; gap: .85rem;
	margin: 0 0 1.5rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem; font-weight: 600; line-height: 1.4;
	letter-spacing: .26em; text-transform: uppercase;
	color: #fff;
	text-shadow: 0 1px 2px rgba(10, 12, 16, .55);
}
.tyb-hero6__kicker::before { content: ''; flex: none; width: 32px; height: 2px; background: var(--tyb-gold-lt); }
.tyb-hero6__face { display: none; }

.tyb-hero6 .tyb-hero__title {
	margin: 0;
	font-size: clamp(2.4rem, 1.2rem + 3vw, 3.75rem);
	line-height: 1.09;
	letter-spacing: -.014em;
	text-wrap: balance;
	color: #fff;
	text-shadow: 0 1px 2px rgba(10, 12, 16, .35), 0 2px 22px rgba(10, 12, 16, .3);
}
/* Over about 90 characters the H1 steps down, so four lines are not a slab. */
.tyb-hero6--long .tyb-hero__title { font-size: clamp(2.2rem, 1.05rem + 2.7vw, 3.3rem); }
.tyb-hero6 .tyb-hero__lede {
	margin: 1.4rem 0 0;
	max-width: 30rem;
	font-size: clamp(1.05rem, 1rem + .3vw, 1.2rem);
	line-height: 1.55;
	color: #fff;
	text-wrap: balance;
	text-shadow: 0 1px 2px rgba(10, 12, 16, .45);
}

/* The optional credentials: one quiet line of words. Empty by default. */
.tyb-hero6__chips {
	list-style: none; margin: 1.15rem 0 0; padding: 0;
	display: flex; flex-wrap: wrap; gap: .3rem 0;
	font-size: .8125rem; font-weight: 600; letter-spacing: .04em;
	color: #fff; text-shadow: 0 1px 2px rgba(10, 12, 16, .55);
}
/* The dot follows its item, so a row that wraps on a phone never starts a line with one. */
.tyb-hero6__chips li:not(:last-child)::after { content: '\00B7'; margin: 0 .7rem; opacity: .8; }

/* THE ONE ACTION: one white bar, an address and a button. */
.tyb-hero6__act { margin-top: 2.75rem; max-width: 35rem; }
.tyb-hero6__bar {
	display: flex; align-items: center;
	width: 100%; max-width: 35rem;
	padding: 6px;
	background: #fff;
	border-radius: 10px;
	box-shadow: 0 1px 2px rgba(8, 26, 41, .18), 0 22px 44px -20px rgba(8, 26, 41, .6);
	transition: box-shadow .2s var(--tyb-ease);
}
.tyb-hero6__bar:focus-within { box-shadow: 0 0 0 2px #fff, 0 0 0 5px var(--tyb-gold-lt), 0 22px 44px -20px rgba(8, 26, 41, .6); }
.tyb-hero6__pin { flex: none; width: 20px; height: 20px; margin-left: .95rem; color: var(--tyb-faint); }
.tyb-hero6__bar input {
	flex: 1 1 auto; min-width: 0;
	height: 52px; padding: 0 .9rem 0 .7rem;
	border: 0; outline: 0; background: transparent; box-shadow: none; border-radius: 0;
	font: 400 1.0625rem/1.2 var(--tyb-body-font);
	color: var(--tyb-ink);
}
.tyb-hero6__bar input::placeholder { color: var(--tyb-muted); opacity: 1; }
.tyb-hero6__go {
	flex: none;
	height: 52px; padding: 0 1.5rem;
	border: 0; border-radius: 5px;
	background: var(--tyb-coral); color: #fff;
	font: 600 .8125rem/1 var(--tyb-body-font);
	letter-spacing: .1em; text-transform: uppercase; white-space: nowrap;
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
	transition: background .2s var(--tyb-ease), transform .08s var(--tyb-ease);
}
.tyb-hero6__go:hover { background: var(--tyb-coral-dk); }
.tyb-hero6__go:focus-visible { background: var(--tyb-coral-dk); outline: 2px solid var(--tyb-deep); outline-offset: 2px; }
.tyb-hero6__go:active { transform: scale(.985); }
.tyb-hero6__note {
	width: fit-content; max-width: 100%;
	margin: .9rem 0 0;
	font-size: .8125rem; font-weight: 500; line-height: 1.4;
	color: #fff; opacity: .92;
	text-shadow: 0 1px 2px rgba(10, 12, 16, .6), 0 0 14px rgba(10, 12, 16, .35);
}
/* 'contact': one button is the whole action, so it is given the bar's weight. */
.tyb-hero6__go--solo {
	display: inline-flex; align-items: center; justify-content: center;
	min-width: 15rem; height: 58px; padding: 0 2.2rem;
	font-size: .84rem; border-radius: 6px; text-decoration: none;
	box-shadow: 0 18px 36px -18px rgba(8, 26, 41, .6);
}
.tyb-hero6__go--solo:focus-visible { outline-color: #fff; }
/* 'search' (IDX sites): the search panel keeps to the copy's side. */
.tyb-hero6.tyb-hero6--search .tyb-hero6__act { max-width: 46rem; }

/* The copy arrives once. The H1 is left out so the headline paints at once. */
@media (prefers-reduced-motion: no-preference) {
	@keyframes tyb-rise6 { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
	.tyb-hero6__kicker, .tyb-hero6 .tyb-hero__lede, .tyb-hero6__chips, .tyb-hero6__act { animation: tyb-rise6 .55s var(--tyb-ease) both; }
	.tyb-hero6__kicker { animation-delay: .04s; }
	.tyb-hero6 .tyb-hero__lede { animation-delay: .1s; }
	.tyb-hero6__chips { animation-delay: .14s; }
	.tyb-hero6__act { animation-delay: .18s; }
}

/* Up to 900px the photograph is the portrait crop and the copy runs most of
   the width, so the shade is top to bottom: light over the top of the
   picture, full strength only where the words are. */
@media (max-width: 900px) {
	.tyb-hero6 .tyb-hero__scrim {
		background: linear-gradient(to bottom, rgba(12, 18, 22, .12) 0%, rgba(12, 18, 22, .22) 14%, rgba(12, 18, 22, .54) 28%, rgba(12, 18, 22, .6) 100%);
	}
	/* The bar while it is arriving on a phone: the hero's white kicker scrolls
	   up behind a half-white bar and used to overprint the firm name in the
	   logo. A blur that exists only mid-fade (nothing at rest, nothing once
	   the bar is white) turns it into a soft shade. */
	.tyb-mast--transparent.tyb-home .tyb-header__bar {
		-webkit-backdrop-filter: blur(calc(var(--tyb-shrink) * (1 - var(--tyb-shrink)) * 48px));
		backdrop-filter: blur(calc(var(--tyb-shrink) * (1 - var(--tyb-shrink)) * 48px));
	}
	.tyb-mast--transparent.tyb-home .tyb-hero6::before {
		background: linear-gradient(to bottom,
			rgba(16, 18, 22, .6) 0,
			rgba(16, 18, 22, .52) calc(var(--tyb-header-h) * .7),
			rgba(16, 18, 22, .28) var(--tyb-header-h),
			rgba(16, 18, 22, .12) calc(var(--tyb-header-h) + 3rem),
			rgba(16, 18, 22, 0) 100%);
	}
	.tyb-mast--transparent.tyb-home .tyb-header__bar {
		background:
			linear-gradient(rgba(255, 255, 255, var(--tyb-shrink)), rgba(255, 255, 255, var(--tyb-shrink))),
			linear-gradient(rgba(16, 18, 22, calc(1.6 * var(--tyb-shrink) * (1 - var(--tyb-shrink)))), rgba(16, 18, 22, calc(1.6 * var(--tyb-shrink) * (1 - var(--tyb-shrink)))));
	}
}
@media (min-width: 641px) and (max-width: 900px) {
	.tyb-hero6 { min-height: min(78vh, 40rem); }
}

/* PHONE. The first screen is 390x664: kicker, H1, the sentence and the whole
   bar are inside it. The copy starts at a FIXED distance under the masthead
   (kicker at 165px, H1 at 196px with the 96px bar), so the top of the
   photograph is clear and the H1 is inside the top 200px whatever the copy:
   no sentence, a two-line headline or one button all leave the H1 where it
   is and shorten the hero, down to a floor of 26rem. (It was a 34rem floor
   with the copy at the bottom, which held the H1 at 196px for the sample's
   copy only: with no sentence it sat at 260px.) */
@media (max-width: 640px) {
	.tyb-hero6 { min-height: 26rem; }
	.tyb-mast--light .tyb-hero6, .tyb-mast--dark .tyb-hero6 { min-height: 26rem; }
	.tyb-hero6 > .tyb-wrap { align-items: flex-start; }
	.tyb-hero6.tyb-hero6--a .tyb-hero__inner { padding-block: 4.3125rem 2.1rem; }
	/* The copy is at fixed heights now, so the shade is too: a third lighter
	   between the masthead and the kicker than it was (frame 2 read as a flat
	   grey-blue lid), full strength from the kicker down. */
	.tyb-hero6 .tyb-hero__scrim {
		background: linear-gradient(to bottom, rgba(12, 18, 22, .1) 0, rgba(12, 18, 22, .14) 84px, rgba(12, 18, 22, .32) 140px, rgba(12, 18, 22, .54) 172px, rgba(12, 18, 22, .6) 100%);
	}
	.tyb-mast--transparent.tyb-home .tyb-hero6 .tyb-hero__scrim {
		-webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, .22) 0, rgba(0, 0, 0, .22) calc(var(--tyb-header-h) * .6), #000 calc(var(--tyb-header-h) + .75rem));
		mask-image: linear-gradient(to bottom, rgba(0, 0, 0, .22) 0, rgba(0, 0, 0, .22) calc(var(--tyb-header-h) * .6), #000 calc(var(--tyb-header-h) + .75rem));
	}
	.tyb-hero6__kicker { margin-bottom: 1rem; gap: .7rem; letter-spacing: .22em; }
	.tyb-hero6__kicker::before { width: 22px; }
	/* The face (assets/img/callbar-face.jpg): 44px with a white ring, in place of the rule. */
	.tyb-hero6__kicker--face::before { display: none; }
	.tyb-hero6__kicker--face .tyb-hero6__face {
		display: block; flex: none; width: 44px; height: 44px; border-radius: 50%; object-fit: cover;
		box-shadow: 0 0 0 2px #fff, 0 4px 12px rgba(10, 12, 16, .4);
	}
	.tyb-hero6 .tyb-hero__title { font-size: clamp(2rem, 1.2rem + 3.6vw, 2.35rem); line-height: 1.1; }
	/* A headline's hand-set breaks are for desktop; a phone balances the lines itself. */
	.tyb-hero6 .tyb-hero__title br { display: none; }
	.tyb-hero6--long .tyb-hero__title { font-size: clamp(1.8rem, 1.1rem + 3.2vw, 2.1rem); }
	.tyb-hero6 .tyb-hero__lede { margin-top: 1rem; max-width: none; font-size: 1rem; line-height: 1.5; text-wrap: pretty; }
	.tyb-hero6__chips { margin-top: .85rem; font-size: .78rem; }
	.tyb-hero6__act { margin-top: 1.6rem; max-width: none; }
	/* The bar stacks into one two-row control: the field, then a full-width button. */
	.tyb-hero6__bar { flex-wrap: wrap; max-width: none; padding: 5px; }
	.tyb-hero6__pin { margin-left: .7rem; }
	.tyb-hero6__bar input { flex: 1 1 0; height: 50px; font-size: 1rem; }
	.tyb-hero6__go { flex: 1 1 100%; height: 50px; margin-top: 5px; font-size: .8125rem; }
	.tyb-hero6__go--solo { width: 100%; height: 54px; margin-top: 0; }
	.tyb-hero6__note { display: none; }
}

/* ── The figures directly under a photo band: a white strip ───────────────
   parts/figures.php adds .tyb-nums5--light when the band sits directly under
   another photo band, which with the default order is the hero. Numerals in
   the brand's dark color, hairlines between them, no photograph. The hero's
   four-color stripe is the only seam. */
.tyb-nums5--light {
	padding-block: clamp(2.25rem, 4.2vw, 3.6rem);
	background: #fff;
	color: var(--tyb-ink);
	border-bottom: 1px solid var(--tyb-line);
}
.tyb-nums5--light .tyb-nums5__list { margin-top: 0; column-gap: 0; }
.tyb-nums5--light .tyb-nums5__list li {
	padding: .35rem 0 .35rem clamp(1.25rem, 2.6vw, 2.5rem);
	border-top: 0;
	border-left: 1px solid var(--tyb-line);
}
.tyb-nums5--light .tyb-nums5__list li:first-child { padding-left: 0; border-left: 0; }
.tyb-nums5--light .tyb-nums5__num { font-size: clamp(2.75rem, 1.6rem + 3.4vw, 4.5rem); line-height: 1; color: var(--tyb-deep); }
.tyb-nums5--light .tyb-nums5__note { margin-top: .7rem; color: var(--tyb-muted); }
@media (max-width: 640px) {
	.tyb-nums5--light { padding-block: 1.9rem; }
	.tyb-nums5--light .tyb-nums5__list { row-gap: 0; column-gap: 0; margin-top: 0; }
	.tyb-nums5--light .tyb-nums5__list li { padding: 1.05rem 0 1.05rem 1.25rem; }
	.tyb-nums5--light .tyb-nums5__list li:nth-child(odd) { padding-left: 0; border-left: 0; }
	.tyb-nums5--light .tyb-nums5__list li:nth-child(n+3) { border-top: 1px solid var(--tyb-line); }
	.tyb-nums5--light .tyb-nums5__list li:nth-child(-n+2) { padding-top: 0; }
	.tyb-nums5--light .tyb-nums5__list li:nth-last-child(-n+2):nth-child(odd),
	.tyb-nums5--light .tyb-nums5__list li:last-child { padding-bottom: 0; }
	.tyb-nums5--light .tyb-nums5__num { font-size: 2.75rem; }
	.tyb-nums5--light .tyb-nums5__note { margin-top: .5rem; }
}

/* ── The plain sections take turns on the two light grounds ───────────────
   front-page.php adds one of these to each plain section in the order it
   renders them, so reordering never puts two sections on the same ground
   back to back. They replace the fixed grounds set per section in the SLEEK
   HOME block. */
.tyb-ground--shell { background: var(--tyb-shell); }
.tyb-ground--white { background: #fff; }

/* ── B1: a row of cards never scrolls up and down inside itself ───────────
   Adam, on his phone: "i can scroll up and down within an inner section of
   the properties." Measured at 390 on the listings row: scrollHeight 368
   against clientHeight 352, overflow-y computed `auto`. Two causes together.
   (1) overflow-x: auto on the track turns overflow-y into auto as well.
   (2) Each card waits for its scroll-reveal 16px below its place, and the
   cards still off to the right never get revealed, so the row's content was
   16px taller than its box for good.
   So the track is closed top to bottom, and a card inside a row fades in
   without moving. Swiping sideways and the snap are untouched, and a finger
   moving up or down on a card scrolls the page (touch-action is left alone). */
.tyb-slider__track { overflow-y: hidden; }
html.js .tyb-slider__track [data-tyb-reveal],
html.js .tyb-slider__track [data-tyb-reveal].is-in { transform: none; }

/* ── The logo over the home hero is quieter ───────────────────────────────
   The lockup's name and the H1 begin with the same two words, one directly
   above the other, and at its full size the logo was as large as the H1: the
   name read as printed twice. Over the hero (transparent masthead, home page
   only) the logo starts smaller: about 210px wide for the generated 3:1
   lockup, 150px on a phone. It still eases down to the scrolled size, and the
   bar's own height does not change, so nothing below moves. */
.tyb-mast--transparent.tyb-home { --tyb-logo-max: 70px; }
@media (max-width: 900px) {
	.tyb-mast--transparent.tyb-home { --tyb-logo-max: 50px; }
}

/* ── Inner banners speak the hero's language ──────────────────────────────
   One short gold line before the kicker, as on the home hero (it was the
   four-color dash: two versions of one element). The sentence is balanced
   and kept to a measure, so it never leaves one word alone on a line. */
.tyb-banner .tyb-eyebrow::before { width: 32px; height: 2px; background: var(--tyb-gold-lt); }
.tyb-banner__lede { max-width: 38rem; text-wrap: balance; }
/* A bright photograph used to fade to bare white at the banner's right edge
   (the scrim pools bottom left and was nothing at the far side), so the
   banner looked unfinished against the page. A light shade grows toward the
   right edge; the words' side is unchanged. */
@media (min-width: 901px) {
	.tyb-banner__scrim {
		background:
			radial-gradient(ellipse 115% 150% at 0% 100%,
				rgba(var(--tyb-scrim5), var(--tyb-scrim-banner, .55)) 0%,
				rgba(var(--tyb-scrim5), var(--tyb-scrim-banner, .55)) 55%,
				rgba(var(--tyb-scrim5), 0) 100%),
			linear-gradient(to top, rgba(var(--tyb-scrim5), .2), rgba(var(--tyb-scrim5), 0) 70%),
			linear-gradient(to right, rgba(var(--tyb-scrim5), 0) 45%, rgba(var(--tyb-scrim5), .22) 100%);
	}
}

/* ── The valuation page says the address back ─────────────────────────────
   templates/home-valuation.php prints "Your valuation for <address>" as the
   form's heading when the visitor arrives from the hero's bar. An address can
   be one long unbroken string. */
.tyb-val-addr { text-wrap: balance; overflow-wrap: anywhere; }

/* ── H6: the filled phone and envelope sit on the text's baseline ─────────
   tyb_icon( 'phone' ) and ( 'mail' ) are filled drawings now (functions.php). */

/* ═════════════════════════ end SIMPLE HERO 2026-10-04 ═════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the page lock
   (The round-5 tile menu that filled this block was removed in ROUND 9
   2026-10-05. The phone menu is now the four blocks headed "ROUND 9
   2026-10-05 — the phone menu" at the end of this file.) What is left is
   shared with the popup: theme.js locks the page behind either of them.
   ═══════════════════════════════════════════════════════════════════════════ */

/* The lock both sheets (the menu and the popup) put on the page behind. */
html.tyb-lock { overflow: hidden; }
html.tyb-lock body { padding-right: var(--tyb-sbw, 0px); }

/* the burger is a link to #tyb-menu, so the menu opens with JavaScript off */
.tyb-burger { text-decoration: none; }


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the popup
   parts/enquiry-modal.php. The enquiry form as the agent's own card: their
   color, name and face (when assets/img/callbar-face.jpg exists) on one side,
   the short form on the other. NO phone number anywhere in it.

   Every rule is scoped under .tyb-pop (the modal root carries "tyb-modal
   tyb-pop"), so it outranks the older .tyb-modal rules without !important and
   touches no inline form and not the search notice.

   Three shapes, one markup:
     <= 640px   a bottom sheet, the same family as the phone menu: 28px top
                corners, a grab handle, in over .42s and out over .26s
     641-899px  the same stack as a centered card
     >= 900px   two columns: the agent on the color panel, the form beside it

   WHAT A BUILD MAY SET (on .tyb-pop, in its own block after this one):
     --tyb-pop-ground   the color of the agent's side (default the brand). This one
                        and --tyb-pop-star (the stars on it) are in the first
                        :root, written by scripts/set-palette.py
     --tyb-pop-band     the band at the join (default the palette's other
                        three colors; a black-and-white palette sets one
                        accent color here)
     --tyb-pop-wash     how much brand covers the desktop photograph (.88)
   Motion is transform + opacity only, and is off under reduced motion.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-pop {
	/* --tyb-pop-ground and --tyb-pop-star are in the first :root (round 7). */
	/* three colors, not four: the fourth is the ground the band sits on */
	--tyb-pop-band:   linear-gradient(90deg, var(--tyb-surf) 0 33.34%, var(--tyb-coral) 33.34% 66.67%, var(--tyb-dune) 66.67% 100%);
	--tyb-pop-wash:   .88;
	--tyb-pop-out:    cubic-bezier(.16, 1, .3, 1);
	--tyb-pop-in:     cubic-bezier(.5, 0, .9, .4);
	z-index: 310;
	padding: 24px;
	transition: opacity .26s linear, visibility .26s linear;
	-webkit-tap-highlight-color: transparent;
}
.tyb-pop .tyb-modal__veil {
	background: rgba(var(--tyb-ink-rgb), .62);
	backdrop-filter: blur(6px);
	-webkit-backdrop-filter: blur(6px);
}

/* ------------------------------------------------------------- the card -- */

.tyb-pop .tyb-modal__panel {
	display: flex;
	flex-direction: column;
	width: 100%;
	max-width: 30rem;
	max-height: calc(100vh - 48px);
	max-height: calc(100dvh - 48px);
	padding: 0;
	overflow: hidden;
	background: var(--tyb-shell);
	border-radius: 20px;
	box-shadow: 0 2px 6px rgba(var(--tyb-ink-rgb), .12), 0 32px 72px -24px rgba(var(--tyb-ink-rgb), .55);
	outline: 0;
	opacity: 0;
	transform: translateY(18px) scale(.975);
	transition: transform .26s var(--tyb-pop-in), opacity .2s linear;
}
.tyb-pop.is-open .tyb-modal__panel {
	opacity: 1;
	transform: none;
	transition: transform .42s var(--tyb-pop-out), opacity .22s linear;
}
.tyb-pop .tyb-modal__panel::before { content: none; }
.tyb-pop .tyb-modal__panel.is-dragging { transition: none !important; }

/* -------------------------------------------------- the identity (color) -- */

.tyb-pop__id {
	position: relative;
	flex: none;
	display: flex;
	align-items: center;
	min-height: 88px;
	padding: 20px 68px 18px 20px;
	color: #fff;
	background-color: var(--tyb-pop-ground);
	overflow: hidden;
}
/* The palette, as one band along the join between color and form. */
.tyb-pop__id::after {
	content: '';
	position: absolute;
	left: 0; right: 0; bottom: 0;
	height: 6px;
	background: var(--tyb-pop-band);
}
/* A soft light, top left, so the color has depth and is not a flat block. */
.tyb-pop__id::before {
	content: '';
	position: absolute;
	inset: 0;
	background:
		radial-gradient(120% 140% at 0% 0%, rgba(255, 255, 255, .13) 0%, rgba(255, 255, 255, 0) 55%),
		linear-gradient(160deg, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, .16) 100%);
	pointer-events: none;
}
.tyb-pop__card { position: relative; display: flex; align-items: center; gap: 14px; min-width: 0; }
.tyb-pop__scene { display: none; }
.tyb-pop__handle { display: none; }

.tyb-pop__face {
	flex: none;
	display: block;
	width: 58px; height: 58px;
	border-radius: 50%;
	object-fit: cover;
	background: var(--tyb-brand-pale);
	box-shadow: 0 0 0 2px var(--tyb-pop-ground), 0 0 0 4px var(--tyb-dune);
	margin-left: 4px;
}

.tyb-pop__who { min-width: 0; }
.tyb-pop__name {
	margin: 0;
	font-family: var(--tyb-display);
	font-size: 1.625rem;
	font-weight: 400;
	line-height: 1.08;
	letter-spacing: -.005em;
	color: #fff;
	overflow-wrap: anywhere;
}
.tyb-pop__firm {
	margin: 5px 0 0;
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	line-height: 1.3;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: #fff;
	opacity: .9;
}
.tyb-firmcase .tyb-pop__firm { text-transform: none; letter-spacing: .04em; font-size: .8125rem; }
/* The agent's one line belongs to the wide card only. */
.tyb-pop__about { display: none; }
.tyb-pop__proof {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 7px 0 0;
	font-family: var(--tyb-body-font);
	font-size: .8125rem;
	font-weight: 600;
	line-height: 1;
	color: #fff;
}
.tyb-pop__stars { display: flex; color: var(--tyb-dune); }
.tyb-pop__stars svg { display: block; width: 70px; height: 14px; }

/* ------------------------------------------------------------- the close -- */

.tyb-pop .tyb-modal__close {
	top: 18px; right: 12px;
	z-index: 2;
	width: 48px; height: 48px;
	min-width: 48px; min-height: 48px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: rgba(255, 255, 255, .16);
	color: #fff;
	font-size: 0;
	transition: background .18s linear, transform .18s var(--tyb-ease);
}
.tyb-pop .tyb-modal__close:hover { background: rgba(255, 255, 255, .3); color: #fff; border-color: transparent; }
.tyb-pop .tyb-modal__close:active { transform: scale(.92); }
.tyb-pop .tyb-modal__close:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* -------------------------------------------------------------- the form -- */

.tyb-pop__body {
	position: relative;
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
	min-height: 0;
	overflow-y: auto;
	overscroll-behavior: contain;
	-webkit-overflow-scrolling: touch;
	padding: 18px 20px 20px;
	background: var(--tyb-shell);
}

.tyb-pop .tyb-modal__head { display: flex; align-items: center; gap: 12px; margin: 0 0 12px; text-align: left; }
.tyb-pop__headtxt { min-width: 0; flex: 1 1 auto; }
.tyb-pop .tyb-modal__head h2 {
	margin: 0;
	padding: 0;
	font-family: var(--tyb-display);
	font-size: 1.75rem;
	font-weight: 400;
	line-height: 1.12;
	letter-spacing: -.01em;
	color: var(--tyb-ink);
	text-wrap: balance;
}
.tyb-pop__line {
	margin: 4px 0 0;
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	line-height: 1.4;
	color: var(--tyb-muted);
}
.tyb-pop__line[hidden], .tyb-pop__thumb[hidden], .tyb-pop [hidden] { display: none !important; }
/* In the listing context the line is the address: it reads as a label, with
   the listing's own photograph beside the heading. */
.tyb-pop__line.is-address {
	display: flex;
	align-items: flex-start;
	gap: 5px;
	font-size: .875rem;
	font-weight: 600;
	line-height: 1.35;
	color: var(--tyb-brand);
	text-wrap: balance;
}
.tyb-pop__line.is-address::before {
	content: '';
	flex: none;
	width: 15px; height: 15px;
	margin-top: 2px;
	background: var(--tyb-coral);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 .8a5.2 5.2 0 0 0-5.2 5.2c0 3.7 4.3 8.5 4.7 8.9a.7.7 0 0 0 1 0c.4-.4 4.7-5.2 4.7-8.9A5.2 5.2 0 0 0 8 .8zm0 7.1a1.9 1.9 0 1 1 0-3.8 1.9 1.9 0 0 1 0 3.8z'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 .8a5.2 5.2 0 0 0-5.2 5.2c0 3.7 4.3 8.5 4.7 8.9a.7.7 0 0 0 1 0c.4-.4 4.7-5.2 4.7-8.9A5.2 5.2 0 0 0 8 .8zm0 7.1a1.9 1.9 0 1 1 0-3.8 1.9 1.9 0 0 1 0 3.8z'/%3E%3C/svg%3E") center / contain no-repeat;
}
.tyb-pop__thumb {
	flex: none;
	width: 56px; height: 56px;
	border-radius: 12px;
	object-fit: cover;
	background: var(--tyb-tint);
	box-shadow: 0 0 0 1px var(--tyb-line);
}

.tyb-pop .tyb-form { display: grid; gap: 9px; margin: 0; }
.tyb-pop .tyb-form.is-sending { opacity: 1; }
.tyb-pop .tyb-field { gap: 4px; margin: 0; }
.tyb-pop .tyb-field__row { display: grid; grid-template-columns: 1fr; gap: 9px; }

/* The order on screen: address (a valuation), name, phone + email, the line
   about them, the message, a failed send's note, the button. The note about
   a missing phone or email takes the hint's own slot, under the two fields
   it is about. Visual order only: the note is a live region, read out
   wherever it sits. */
.tyb-pop .tyb-form > .tyb-field--addr      { order: 1; }
.tyb-pop .tyb-form > .tyb-field--name      { order: 2; }
.tyb-pop .tyb-form > .tyb-field__row       { order: 3; }
.tyb-pop .tyb-form > .tyb-form__hint       { order: 4; }
.tyb-pop .tyb-form > .tyb-field--message   { order: 5; }
.tyb-pop .tyb-form > .tyb-form__note       { order: 6; }
.tyb-pop .tyb-form > .tyb-form__note[data-tyb-reach-note] { order: 4; }
.tyb-pop .tyb-form > .tyb-form__send       { order: 7; }

.tyb-pop .tyb-field label {
	font-family: var(--tyb-body-font);
	font-size: .8125rem;
	font-weight: 600;
	line-height: 1.3;
	letter-spacing: 0;
	text-transform: none;
	color: var(--tyb-ink);
	transition: color .15s linear;
}
.tyb-pop .tyb-field label span { color: inherit; }
.tyb-pop .tyb-field label .tyb-form__opt { font-weight: 400; font-style: normal; color: var(--tyb-muted); }
/* the field you are in: its label and its edge take the brand color */
.tyb-pop .tyb-field:focus-within > label { color: var(--tyb-brand); }

.tyb-pop .tyb-field input,
.tyb-pop .tyb-field textarea {
	width: 100%;
	margin: 0;
	padding: 0 14px;
	border: 1px solid var(--tyb-stone);
	border-radius: 10px;
	background: #fff;
	box-shadow: none;
	font-family: var(--tyb-body-font);
	font-size: max(1rem, 16px);
	line-height: 1.35;
	color: var(--tyb-ink);
	-webkit-appearance: none;
	appearance: none;
	transition: border-color .15s linear, box-shadow .15s linear, background .15s linear;
}
.tyb-pop .tyb-field input { height: 48px; min-height: 48px; }
/* one line tall; theme.js grows it with what is typed */
.tyb-pop .tyb-field textarea {
	height: 48px; min-height: 48px; max-height: 132px;
	padding-block: 12px;
	resize: none;
	overflow-y: auto;
}
.tyb-pop .tyb-field input::placeholder,
.tyb-pop .tyb-field textarea::placeholder { color: var(--tyb-faint); opacity: 1; }
.tyb-pop .tyb-field input:hover,
.tyb-pop .tyb-field textarea:hover { border-color: var(--tyb-brand); }
.tyb-pop .tyb-field input:focus,
.tyb-pop .tyb-field textarea:focus {
	outline: 0;
	border-color: var(--tyb-brand);
	box-shadow: 0 0 0 1px var(--tyb-brand), 0 0 0 4px var(--tyb-surf);
}
.tyb-pop .tyb-field input[aria-invalid="true"] {
	border-color: #B4301F;
	box-shadow: 0 0 0 1px #B4301F;
	background: #FFF8F6;
}

/* The line under phone and email, and the note that replaces it when both
   are empty, share one slot that is always two lines tall: the sheet does not
   move when the note appears. */
.tyb-pop .tyb-form__hint,
.tyb-pop .tyb-form__note[data-tyb-reach-note] {
	min-height: 2.8em;
	margin: -3px 0 -2px;
	font-size: .8125rem;
	line-height: 1.4;
}
.tyb-pop .tyb-form__hint { color: var(--tyb-muted); }
.tyb-pop .tyb-form:has(.tyb-form__note[data-tyb-reach-note]) .tyb-form__hint { display: none; }

.tyb-pop .tyb-form__note { min-height: 0; margin: 0; font-size: .8125rem; line-height: 1.4; }
.tyb-pop .tyb-form__note:empty { display: none; }
/* "Sending..." is said to a screen reader and shown on the button instead. */
.tyb-pop .tyb-form__note:not(.is-bad) {
	position: absolute; width: 1px; height: 1px;
	margin: -1px; padding: 0; overflow: hidden;
	clip: rect(0 0 0 0); white-space: nowrap;
}
.tyb-pop .tyb-form__note.is-bad {
	display: flex;
	align-items: flex-start;
	gap: 7px;
	font-weight: 600;
	color: #A3281A;
}
.tyb-pop .tyb-form__note.is-bad::before {
	content: '!';
	flex: none;
	width: 16px; height: 16px;
	margin-top: 1px;
	border-radius: 50%;
	background: #B4301F;
	font-size: .6875rem;
	font-weight: 700;
	line-height: 16px;
	text-align: center;
	color: #fff;
}

.tyb-pop .tyb-form__send {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	width: 100%;
	height: 54px; min-height: 54px;
	margin-top: 2px;
	padding: 0 20px;
	border: 0;
	border-radius: 12px;
	background: var(--tyb-coral);
	box-shadow: 0 10px 22px -12px var(--tyb-coral-dk);
	font-family: var(--tyb-body-font);
	font-size: .875rem;
	font-weight: 600;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: #fff;
	transition: background .18s linear, transform .1s var(--tyb-ease), box-shadow .18s linear;
}
.tyb-pop .tyb-form__send:hover {
	background: var(--tyb-coral-dk);
	border-color: transparent;
	color: #fff;
	transform: none;
	box-shadow: 0 12px 24px -12px var(--tyb-coral-dk);
}
.tyb-pop .tyb-form__send:active { transform: scale(.985); }
.tyb-pop .tyb-form__send:focus-visible { outline: 2px solid var(--tyb-deep); outline-offset: 3px; }
/* The arrow: drawn, so it takes the button's own color and loads nothing. */
.tyb-pop .tyb-form__send::after {
	content: '';
	flex: none;
	width: 18px; height: 18px;
	background: currentColor;
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'%3E%3Cpath d='M3 9h11M10 4.5L14.5 9 10 13.5' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'%3E%3Cpath d='M3 9h11M10 4.5L14.5 9 10 13.5' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
	transition: transform .2s var(--tyb-ease);
}
.tyb-pop .tyb-form__send:hover::after { transform: translateX(3px); }
/* Sending: the arrow becomes a spinner; the button cannot be pressed twice. */
.tyb-pop .tyb-form.is-sending .tyb-form__send { pointer-events: none; background: var(--tyb-coral-dk); }
.tyb-pop .tyb-form.is-sending .tyb-form__send::after {
	-webkit-mask: none; mask: none;
	background: none;
	border: 2px solid rgba(255, 255, 255, .45);
	border-top-color: #fff;
	border-radius: 50%;
	width: 16px; height: 16px;
	animation: tyb-pop-spin .7s linear infinite;
}
@keyframes tyb-pop-spin { to { transform: rotate(360deg); } }

/* --------------------------------------------------------- the thank-you -- */

.tyb-pop__done { display: none; }
.tyb-pop.is-sent .tyb-pop__head,
.tyb-pop.is-sent .tyb-form { display: none; }
.tyb-pop.is-sent .tyb-pop__done {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	flex: 1 1 auto;
	padding: 20px 8px;
	text-align: center;
	outline: 0;
}
.tyb-pop__tick {
	position: relative;
	display: flex; align-items: center; justify-content: center;
	width: 76px; height: 76px;
	border-radius: 50%;
	background: var(--tyb-surf-pale);
	color: var(--tyb-coral);
}
.tyb-pop__tick svg { display: block; width: 76px; height: 76px; }
.tyb-pop__tick-ring { stroke: var(--tyb-surf); stroke-dasharray: 158; stroke-dashoffset: 0; transform-origin: 50% 50%; transform: rotate(-90deg); }
.tyb-pop__tick-mark { stroke-dasharray: 34; stroke-dashoffset: 0; }
/* With a face, the agent is the one thanking them: the face, and the check as
   a badge on it. */
.tyb-pop__tick--face { background: none; box-shadow: 0 0 0 3px var(--tyb-shell), 0 0 0 5px var(--tyb-dune); }
.tyb-pop__tick--face img { display: block; width: 76px; height: 76px; border-radius: 50%; object-fit: cover; }
.tyb-pop__tick--face svg {
	position: absolute;
	right: -8px; bottom: -6px;
	width: 32px; height: 32px;
	border-radius: 50%;
	background: var(--tyb-coral);
	box-shadow: 0 0 0 3px var(--tyb-shell);
	color: #fff;
}
.tyb-pop__tick--face .tyb-pop__tick-ring { stroke: transparent; }
.tyb-pop__tick--face .tyb-pop__tick-mark { stroke-width: 5; }

.tyb-pop.is-sent .tyb-pop__tick { animation: tyb-pop-pop .5s var(--tyb-pop-out) both; }
.tyb-pop.is-sent .tyb-pop__tick-ring { animation: tyb-pop-ring .6s .1s var(--tyb-ease) both; }
.tyb-pop.is-sent .tyb-pop__tick-mark { animation: tyb-pop-mark .34s .5s var(--tyb-ease) both; }
.tyb-pop.is-sent .tyb-pop__done-title,
.tyb-pop.is-sent .tyb-pop__done-text,
.tyb-pop.is-sent .tyb-pop__done-rule,
.tyb-pop.is-sent .tyb-pop__done-btn { animation: tyb-pop-rise .5s .28s var(--tyb-pop-out) both; }
.tyb-pop.is-sent .tyb-pop__done-text { animation-delay: .34s; }
.tyb-pop.is-sent .tyb-pop__done-rule { animation-delay: .4s; }
.tyb-pop.is-sent .tyb-pop__done-btn { animation-delay: .46s; }
@keyframes tyb-pop-pop  { from { opacity: 0; transform: scale(.6); } to { opacity: 1; transform: none; } }
@keyframes tyb-pop-ring { from { stroke-dashoffset: 158; } to { stroke-dashoffset: 0; } }
@keyframes tyb-pop-mark { from { stroke-dashoffset: 34; } to { stroke-dashoffset: 0; } }
@keyframes tyb-pop-rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

.tyb-pop__done-title {
	margin: 20px 0 0;
	font-family: var(--tyb-display);
	font-size: 2rem;
	font-weight: 400;
	line-height: 1.1;
	letter-spacing: -.01em;
	color: var(--tyb-ink);
	overflow-wrap: anywhere;
}
.tyb-pop__done-text {
	max-width: 22em;
	margin: 10px 0 0;
	font-size: 1rem;
	line-height: 1.5;
	color: var(--tyb-body);
}
.tyb-pop__done-rule {
	display: block;
	width: 72px; height: 4px;
	margin: 22px 0 0;
	border-radius: 2px;
	background: var(--tyb-rule4);
}
.tyb-pop__done-btn {
	min-width: 168px;
	height: 52px;
	margin: 24px 0 0;
	padding: 0 28px;
	border: 0;
	border-radius: 12px;
	background: var(--tyb-brand);
	font-family: var(--tyb-body-font);
	font-size: .875rem;
	font-weight: 600;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: #fff;
	cursor: pointer;
	transition: background .18s linear, transform .1s var(--tyb-ease);
}
.tyb-pop__done-btn:hover { background: var(--tyb-deep); color: #fff; }
.tyb-pop__done-btn:active { transform: scale(.985); }
.tyb-pop__done-btn:focus-visible { outline: 2px solid var(--tyb-deep); outline-offset: 3px; }

/* ------------------------------------------------- the stagger on opening -- */

.tyb-pop .tyb-pop__card,
.tyb-pop .tyb-pop__head,
.tyb-pop .tyb-form {
	opacity: 0;
	transform: translateY(10px);
	transition: none;
}
.tyb-pop.is-open .tyb-pop__card,
.tyb-pop.is-open .tyb-pop__head,
.tyb-pop.is-open .tyb-form {
	opacity: 1;
	transform: none;
	transition: opacity .32s linear, transform .5s var(--tyb-pop-out);
}
.tyb-pop.is-open .tyb-pop__card { transition-delay: .1s; }
.tyb-pop.is-open .tyb-pop__head { transition-delay: .16s; }
.tyb-pop.is-open .tyb-form { transition-delay: .22s; }

/* ------------------------------------------------ phones: a bottom sheet -- */

@media (max-width: 640px) {
	.tyb-pop { align-items: flex-end; padding: 0; }
	.tyb-pop .tyb-modal__panel {
		max-width: none;
		max-height: calc(100vh - 10px);
		max-height: calc(100dvh - 10px);
		border-radius: 28px 28px 0 0;
		box-shadow: 0 -18px 50px -18px rgba(var(--tyb-ink-rgb), .5);
		opacity: 1;
		transform: translateY(104%);
		transition: transform .26s var(--tyb-pop-in);
	}
	.tyb-pop.is-open .tyb-modal__panel {
		transform: none;
		transition: transform .42s var(--tyb-pop-out);
	}
	/* the color bar is what the sheet is pulled down by */
	.tyb-pop__id { min-height: 92px; padding: 22px 68px 18px 16px; touch-action: none; -webkit-user-select: none; user-select: none; }
	.tyb-pop__handle {
		display: block;
		position: absolute;
		top: 8px; left: 50%;
		width: 40px; height: 4px;
		margin-left: -20px;
		border-radius: 2px;
		background: #fff;
		opacity: .42;
	}
	.tyb-pop .tyb-modal__close { top: 22px; }
	.tyb-pop__body {
		padding: 12px 16px 16px;
		padding-bottom: max(16px, env(safe-area-inset-bottom));
	}
	.tyb-pop .tyb-modal__head { margin-bottom: 10px; }
	.tyb-pop .tyb-modal__head h2 { font-size: 1.625rem; }
	.tyb-pop .tyb-form { gap: 8px; }
	.tyb-pop .tyb-field__row { gap: 8px; }
}

/* Short phones (an iPhone SE in Safari, about 550px of page): tighten a
   little so the sheet still does not scroll. */
@media (max-width: 640px) and (max-height: 620px) {
	.tyb-pop__id { min-height: 68px; padding-top: 18px; padding-bottom: 14px; }
	.tyb-pop__name { font-size: 1.375rem; }
	.tyb-pop__face { width: 44px; height: 44px; }
	.tyb-pop .tyb-modal__close { top: 12px; }
	.tyb-pop__body { padding-top: 10px; }
	.tyb-pop .tyb-modal__head { margin-bottom: 8px; }
	.tyb-pop .tyb-modal__head h2 { font-size: 1.4375rem; }
	.tyb-pop .tyb-form { gap: 7px; }
	.tyb-pop .tyb-field__row { grid-template-columns: 1fr 1fr; gap: 8px; }
	.tyb-pop .tyb-field input, .tyb-pop .tyb-field textarea { height: 46px; min-height: 46px; }
	.tyb-pop .tyb-field textarea { padding-block: 11px; }
	.tyb-pop .tyb-form__send { height: 50px; min-height: 50px; }
}

/* A phone on its side, or any short window: the form is taller than the
   screen, so the form scrolls under the color bar (which, with the close
   button, stays put). Phone and email share a row to shorten the trip. */
@media (min-width: 641px) and (max-width: 899px) and (max-height: 620px) {
	.tyb-pop .tyb-field__row { grid-template-columns: 1fr 1fr; }
}

/* ------------------------------------------ wide screens: the two columns -- */

@media (min-width: 900px) {
	.tyb-pop .tyb-modal__panel {
		flex-direction: row;
		max-width: 880px;
		min-height: 548px;
		background: #fff;
	}
	.tyb-pop__id {
		flex: 0 0 328px;
		align-items: center;
		min-height: 0;
		padding: 44px 40px 44px 36px;
	}
	/* the band runs down the join */
	.tyb-pop__id::after {
		left: auto; top: 0; right: 0; bottom: 0;
		width: 6px; height: auto;
		background: linear-gradient(180deg,
			var(--tyb-surf) 0 33.34%, var(--tyb-coral) 33.34% 66.67%, var(--tyb-dune) 66.67% 100%);
	}
	.tyb-pop__id::before {
		background:
			radial-gradient(90% 60% at 0% 0%, rgba(255, 255, 255, .14) 0%, rgba(255, 255, 255, 0) 60%),
			linear-gradient(180deg, rgba(0, 0, 0, 0) 45%, rgba(0, 0, 0, .2) 100%);
	}
	/* face, name, firm, the one line and the review total: one group, centered
	   in the height of the panel */
	.tyb-pop__card { flex-direction: column; align-items: flex-start; gap: 0; width: 100%; }
	.tyb-pop__face {
		width: 120px; height: 120px;
		margin: 0 0 28px 5px;
		box-shadow: 0 0 0 3px var(--tyb-pop-ground), 0 0 0 5px var(--tyb-dune);
	}
	.tyb-pop__name { font-size: 2.375rem; line-height: 1.02; letter-spacing: -.015em; }
	.tyb-pop__firm { margin-top: 12px; font-size: .75rem; letter-spacing: .2em; }
	.tyb-pop__about {
		display: block;
		margin: 24px 0 0;
		padding-top: 22px;
		border-top: 1px solid rgba(255, 255, 255, .26);
		font-family: var(--tyb-body-font);
		font-size: 1.0625rem;
		line-height: 1.5;
		color: #fff;
	}
	.tyb-pop__proof { margin-top: 20px; font-size: .875rem; gap: 10px; }
	.tyb-pop__stars svg { width: 80px; height: 16px; }

	/* No face: the market's own photograph under the brand color, and the name
	   set larger. Never initials. */
	.tyb-pop__panel--scene .tyb-pop__scene {
		display: block;
		position: absolute;
		inset: 0;
		width: 100%; height: 100%;
		object-fit: cover;
	}
	.tyb-pop__panel--scene .tyb-pop__id::before {
		background:
			linear-gradient(180deg, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, .22) 100%),
			var(--tyb-pop-ground);
		opacity: var(--tyb-pop-wash);
		z-index: 1;
	}
	.tyb-pop__panel--scene .tyb-pop__card { z-index: 2; }
	.tyb-pop__panel--scene .tyb-pop__id::after { z-index: 2; }
	.tyb-pop__panel:not(.tyb-pop__panel--face) .tyb-pop__name { font-size: 2.75rem; }

	.tyb-pop .tyb-modal__close {
		top: 16px; right: 16px;
		background: var(--tyb-brand-pale);
		color: var(--tyb-ink);
	}
	.tyb-pop .tyb-modal__close:hover { background: var(--tyb-brand-lt); color: var(--tyb-ink); }
	.tyb-pop .tyb-modal__close:focus-visible { outline-color: var(--tyb-deep); }

	.tyb-pop__body {
		justify-content: center;
		padding: 44px 48px 40px;
		background: #fff;
	}
	.tyb-pop .tyb-modal__head { margin-bottom: 20px; padding-right: 40px; }
	.tyb-pop .tyb-modal__head h2 { font-size: 2.125rem; }
	.tyb-pop__line { margin-top: 8px; font-size: 1rem; }
	.tyb-pop__line.is-address { font-size: .9375rem; }
	.tyb-pop__thumb { width: 64px; height: 64px; }
	.tyb-pop .tyb-form { gap: 13px; }
	.tyb-pop .tyb-field { gap: 6px; }
	.tyb-pop .tyb-field__row { grid-template-columns: 1fr 1fr; gap: 14px; }
	.tyb-pop .tyb-field input { height: 50px; min-height: 50px; }
	.tyb-pop .tyb-field textarea { height: 76px; min-height: 76px; }
	.tyb-pop .tyb-form__hint,
	.tyb-pop .tyb-form__note[data-tyb-reach-note] { min-height: 1.4em; margin: -5px 0 -2px; }
	.tyb-pop .tyb-form__send { height: 56px; min-height: 56px; }
	.tyb-pop__tick--face { box-shadow: 0 0 0 3px #fff, 0 0 0 5px var(--tyb-dune); }
	.tyb-pop__tick--face svg { box-shadow: 0 0 0 3px #fff; }
}

/* ---------------------------------------------------------- reduced motion */

@media (prefers-reduced-motion: reduce) {
	.tyb-pop,
	.tyb-pop .tyb-modal__panel,
	.tyb-pop.is-open .tyb-modal__panel,
	.tyb-pop .tyb-pop__card,
	.tyb-pop .tyb-pop__head,
	.tyb-pop .tyb-form,
	.tyb-pop.is-open .tyb-pop__card,
	.tyb-pop.is-open .tyb-pop__head,
	.tyb-pop.is-open .tyb-form,
	.tyb-pop .tyb-form__send,
	.tyb-pop .tyb-form__send::after,
	.tyb-pop .tyb-modal__close,
	.tyb-pop .tyb-field label,
	.tyb-pop__done-btn { transition: none !important; }
	.tyb-pop .tyb-modal__panel { transform: none; opacity: 0; }
	.tyb-pop.is-open .tyb-modal__panel { opacity: 1; }
	.tyb-pop .tyb-pop__card,
	.tyb-pop .tyb-pop__head,
	.tyb-pop .tyb-form { transform: none; }
	.tyb-pop.is-sent .tyb-pop__tick,
	.tyb-pop.is-sent .tyb-pop__tick-ring,
	.tyb-pop.is-sent .tyb-pop__tick-mark,
	.tyb-pop.is-sent .tyb-pop__done-title,
	.tyb-pop.is-sent .tyb-pop__done-text,
	.tyb-pop.is-sent .tyb-pop__done-rule,
	.tyb-pop.is-sent .tyb-pop__done-btn { animation: none !important; }
	.tyb-pop .tyb-form.is-sending .tyb-form__send::after { animation-duration: 1.6s; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the review cards
   Adam: "colored testimonial cards... use the brokers color palette... less
   fancy, frigid, and more inviting to read and browse, but still impressive."

   One solid brand card and pale washes of the other palette colors, by
   position (c1 to c4), so no two neighbors share a color in three columns,
   two or one. Sans-serif text. No shadows. The tokens (--tyb-rvb-*,
   --tyb-rvs2..4-*, --tyb-rv-star) are in :root, written as hex by
   scripts/set-palette.py.

   Markup (parts/reviews.php, parts/review-card.php, templates/testimonials.php):
     section.tyb-rv[.tyb-rv--one | .tyb-rv--page] > .tyb-wrap.tyb-rv__in >
       header.tyb-rv__head > .tyb-kick5 + .tyb-rv__line > h2.tyb-rv__total + .tyb-rv__stars
       .tyb-rv__grid.tyb-rv__grid--n{1-6} | --all > figure.tyb-rvc.tyb-rvc--c{1-4}[.tyb-rvc--lead]
       p.tyb-rv__more > a.tyb-rv__all
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 641px) {
	.tyb-rv { padding-block: var(--tyb-band5); }
	.tyb-rv.tyb-rv--page { padding-block: clamp(2.5rem, 5vw, 4.5rem) var(--tyb-band5); }
}
.tyb-rv.tyb-rv--page { padding-top: 2rem; }

.tyb-rv__in {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	grid-template-areas: "head" "grid" "more";
}
.tyb-rv__head { grid-area: head; min-width: 0; margin-bottom: 1.25rem; }
.tyb-rv__grid { grid-area: grid; }
.tyb-rv .tyb-rv__more { grid-area: more; margin: 0; padding-top: 1rem; }

/* ------------------------------------------------------------- the heading -- */
.tyb-rv__head .tyb-kick5 { margin-bottom: .75rem; }
.tyb-rv__line { display: flex; flex-wrap: wrap; align-items: baseline; gap: .35rem 1.1rem; }
/* The total, as a heading the size of the other section headings: a number
   AND its word on one line, not a numeral standing alone. */
.tyb-rv__total {
	margin: 0;
	font-family: var(--tyb-display);
	font-weight: 400;
	font-size: clamp(2.75rem, 1.5rem + 3.6vw, 4.5rem);
	line-height: .95;
	letter-spacing: -.025em;
	color: var(--tyb-ink);
}
.tyb-rv__total strong { font-weight: 400; color: var(--tyb-coral-dk); }
.tyb-rv__plain { margin: 0; }
.tyb-rv__stars {
	flex: none;
	font-size: 1.1rem;
	line-height: 1;
	letter-spacing: .14em;
	color: var(--tyb-coral-dk);
	white-space: nowrap;
	transform: translateY(-.2em);
}

/* "Read all reviews": one link. A full-width button under the cards on a
   phone, a pill beside the heading from 641px. */
.tyb-rv__all {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: .7rem;
	min-height: 52px;
	padding: 0 1.25rem;
	border: 1px solid var(--tyb-ink);
	border-radius: 999px;
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	font-weight: 600;
	color: var(--tyb-ink);
	transition: background-color .25s var(--tyb-ease), color .25s var(--tyb-ease);
}
.tyb-rv__all .tyb-arrow5 { width: 22px; }
@media (hover: hover) {
	.tyb-rv__all:hover { background: var(--tyb-ink); color: #fff; }
	.tyb-rv__all:hover .tyb-arrow5 { transform: translateX(4px); }
}
.tyb-rv__all:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }

/* ---------------------------------------------------------------- the card -- */
.tyb-rvc {
	--rv-bg: #fff;
	--rv-line: transparent;
	--rv-ink: var(--tyb-ink);
	--rv-meta: var(--tyb-body);
	--rv-accent: var(--tyb-brand);
	--rv-on-accent: #fff;
	--rv-star: var(--tyb-rv-star);
	margin: 0;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	min-width: 0;
	padding: 1.5rem;
	border: 1px solid var(--rv-line);
	border-radius: 16px;
	background: var(--rv-bg);
	color: var(--rv-ink);
}
/* c1: the solid brand card. The disc is the light ink with the brand as its letter. */
.tyb-rvc--c1 {
	--rv-bg: var(--tyb-rvb-bg); --rv-line: var(--tyb-rvb-bg);
	--rv-ink: var(--tyb-rvb-ink); --rv-meta: var(--tyb-rvb-ink);
	--rv-accent: var(--tyb-rvb-ink); --rv-on-accent: var(--tyb-rvb-bg);
	--rv-star: var(--tyb-rvb-ink);
}
.tyb-rvc--c2 { --rv-bg: var(--tyb-rvs2-bg); --rv-line: var(--tyb-rvs2-line); --rv-accent: var(--tyb-rvs2-accent); }
.tyb-rvc--c3 { --rv-bg: var(--tyb-rvs3-bg); --rv-line: var(--tyb-rvs3-line); --rv-accent: var(--tyb-rvs3-accent); }
.tyb-rvc--c4 { --rv-bg: var(--tyb-rvs4-bg); --rv-line: var(--tyb-rvs4-line); --rv-accent: var(--tyb-rvs4-accent); }

.tyb-rvc__top {
	align-self: stretch;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	height: 1.5rem;
	margin-bottom: .85rem;
}
.tyb-rvc__stars { font-size: 1rem; line-height: 1; letter-spacing: .12em; color: var(--rv-star); white-space: nowrap; }
/* The quote mark, on the lead card only. The glyph hangs below its box so the
   row stays one line tall. */
.tyb-rvc__mark {
	margin-left: auto;
	font-family: var(--tyb-display);
	font-size: 4.5rem;
	line-height: 1;
	height: 1.5rem;
	color: var(--rv-accent);
	opacity: .55;
}
.tyb-rvc__text {
	margin: 0 0 1.25rem;
	padding: 0;
	border: 0;
	font-family: var(--tyb-body-font);
	font-style: normal;
	font-size: 1.0625rem;
	font-weight: 400;
	line-height: 1.6;
	color: var(--rv-ink);
	overflow-wrap: break-word;
}
.tyb-rvc__more {
	margin: -.9rem 0 .75rem;
	padding: 0;
	min-height: 44px;
	background: none;
	border: 0;
	font: inherit;
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	font-weight: 600;
	color: var(--rv-ink);
	text-decoration: underline;
	text-decoration-thickness: 1.5px;
	text-underline-offset: 4px;
	cursor: pointer;
}
.tyb-rvc__more[hidden] { display: none; }
.tyb-rvc__more:focus-visible { outline: 2px solid var(--rv-ink); outline-offset: 2px; border-radius: 4px; }
/* The name row is pinned to the bottom, so cards in a row end on one line. */
.tyb-rvc__by {
	margin-top: auto;
	display: flex;
	align-items: center;
	gap: .75rem;
	min-width: 0;
}
.tyb-rvc__av {
	flex: none;
	display: grid;
	place-items: center;
	width: 2.5rem; height: 2.5rem;
	border-radius: 50%;
	background: var(--rv-accent);
	color: var(--rv-on-accent);
	font-family: var(--tyb-body-font);
	font-size: 1.0625rem;
	font-weight: 600;
	line-height: 1;
}
.tyb-rvc__who { display: flex; flex-direction: column; gap: .15rem; min-width: 0; }
.tyb-rvc .tyb-quote__name { font-family: var(--tyb-body-font); font-size: 1rem; font-weight: 600; line-height: 1.3; color: var(--rv-ink); }
.tyb-rvc .tyb-quote__via { font-size: .875rem; font-weight: 400; letter-spacing: 0; text-transform: none; line-height: 1.3; color: var(--rv-meta); }
/* The Google G keeps its own four colors, on a white disc so it reads on any card. */
.tyb-rvc .tyb-gmark { box-sizing: content-box; width: .95em; height: .95em; padding: 2px; border-radius: 50%; background: #fff; transform: none; }

/* ---------------------------------------------------------------- the grid -- */
.tyb-rv__grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: .8rem; }

/* Clamps, only with scripting on (theme.js adds html.tyb-clamp and shows
   "Read more" only where the clamp cuts something). Phone first. */
html.tyb-clamp .tyb-rvc__text:not(.is-open) { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; line-clamp: 4; overflow: hidden; }
html.tyb-clamp .tyb-rvc--lead .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 6; line-clamp: 6; }
html.tyb-clamp .tyb-rv__grid--all .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 7; line-clamp: 7; }

@media (max-width: 640px) {
	/* On the home page a phone gets three cards; the rest are one tap away. */
	.tyb-rv:not(.tyb-rv--page) .tyb-rv__grid > .tyb-rvc:nth-child(n+4) { display: none; }
}

@media (min-width: 641px) {
	.tyb-rv__in { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "head more" "grid grid"; column-gap: 1.5rem; }
	.tyb-rv--page .tyb-rv__in { display: block; }
	.tyb-rv__head { margin-bottom: clamp(1.5rem, 3vw, 2.5rem); }
	.tyb-rv__head .tyb-kick5 { margin-bottom: 1rem; }
	.tyb-rv .tyb-rv__more { align-self: end; margin: 0; padding-bottom: calc(clamp(1.5rem, 3vw, 2.5rem) + .5rem); }
	.tyb-rv__all { display: inline-flex; min-height: 46px; font-size: .9rem; }
	.tyb-rv__stars { font-size: 1.2rem; }

	.tyb-rv__grid { gap: 1rem; }
	.tyb-rvc { padding: 1.75rem; border-radius: 18px; }
	.tyb-rv__grid--n2, .tyb-rv__grid--n3, .tyb-rv__grid--n4, .tyb-rv__grid--n5, .tyb-rv__grid--n6, .tyb-rv__grid--all { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.tyb-rv__grid--n3 > .tyb-rvc--lead, .tyb-rv__grid--n5 > :first-child { grid-column: 1 / -1; }
	.tyb-rv__grid--n1 { grid-template-columns: minmax(0, 52rem); }
	.tyb-rvc--lead { padding: clamp(1.75rem, 3.2vw, 2.5rem); }
	.tyb-rvc--lead .tyb-rvc__text { font-size: clamp(1.2rem, .85rem + .75vw, 1.5rem); line-height: 1.48; letter-spacing: -.008em; }
	.tyb-rvc--lead .tyb-rvc__mark { font-size: 6rem; }
	html.tyb-clamp .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 5; line-clamp: 5; }
	html.tyb-clamp .tyb-rvc--lead .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 7; line-clamp: 7; }
	html.tyb-clamp .tyb-rv__grid--n2 .tyb-rvc__text:not(.is-open),
	html.tyb-clamp .tyb-rv__grid--all .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 7; line-clamp: 7; }
}
@media (min-width: 1041px) {
	.tyb-rv__grid { gap: 1.25rem; }
	.tyb-rvc { padding: 2rem; }
	/* One large and two: the lead takes the left and both rows. */
	.tyb-rv__grid--n3 { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); grid-template-rows: auto auto; }
	.tyb-rv__grid--n3 > .tyb-rvc--lead { grid-column: 1; grid-row: 1 / span 2; }
	html.tyb-clamp .tyb-rv__grid--n3 .tyb-rvc--lead .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 9; line-clamp: 9; }
	html.tyb-clamp .tyb-rv__grid--n3 .tyb-rvc:not(.tyb-rvc--lead) .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 4; line-clamp: 4; }
	/* Five: the first is twice as wide, then four. Six and the page: three across. */
	.tyb-rv__grid--n5, .tyb-rv__grid--n6, .tyb-rv__grid--all { grid-template-columns: repeat(3, minmax(0, 1fr)); }
	.tyb-rv__grid--n5 > :first-child { grid-column: span 2; }
	/* One review: the heading at the left, the card at the right. */
	.tyb-rv--one .tyb-rv__in {
		grid-template-columns: minmax(0, .62fr) minmax(0, 1.38fr);
		grid-template-areas: "head grid" "more grid";
		column-gap: clamp(2rem, 5vw, 5rem);
	}
	.tyb-rv--one .tyb-rv__head { align-self: end; margin-bottom: 1.5rem; }
	.tyb-rv.tyb-rv--one .tyb-rv__more { align-self: start; margin: 0; padding: 0; }
	.tyb-rv--one .tyb-rv__grid--n1 { grid-template-columns: minmax(0, 1fr); }
	html.tyb-clamp .tyb-rv__grid--n1 .tyb-rvc__text:not(.is-open) { -webkit-line-clamp: 8; line-clamp: 8; }
}
@media (prefers-reduced-motion: reduce) {
	.tyb-rv__all, .tyb-rv__all .tyb-arrow5 { transition: none; }
	.tyb-rv__all:hover .tyb-arrow5 { transform: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the three tiles
   Adam: "the individual boxes need to be restyled i dont like that. keep it
   modern simple sleek functional, not too much... remove that same section
   from mobile. keep it on desktop though just change spot."

   A clean photograph; under it the label and a small arrow on one line.
   Nothing is printed on the photograph. New classes (.tyb-intro6, .tyb-tile6)
   so the town tiles, which share .tyb-tile5, are untouched.

   Markup (parts/intro-tiles.php):
     section.tyb-intro5.tyb-intro6 > .tyb-wrap > .tyb-intro5__top + ul.tyb-tiles6 >
       li.tyb-tiles6__item > a.tyb-tile6 > span.tyb-tile6__ph > img.tyb-tile6__img
                                         + span.tyb-tile6__label > span.tyb-tile6__name + svg.tyb-arrow5
   ═══════════════════════════════════════════════════════════════════════════ */

/* Not on phones. The three images are loading="lazy", so with the section
   not displayed a phone never requests them. */
@media (max-width: 640px) { .tyb-intro6 { display: none; } }

@media (min-width: 641px) {
	/* Near the bottom of the page: shorter than the sections above it. */
	.tyb-intro6 { padding-block: clamp(3.5rem, 6vw, 5.5rem); }
}
.tyb-intro6 .tyb-intro5__top { align-items: end; }
.tyb-intro6 .tyb-intro5__text { max-width: 44ch; }

.tyb-tiles6 {
	list-style: none;
	margin: clamp(2rem, 3.4vw, 3rem) 0 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(1.25rem, 2.4vw, 2rem);
}
.tyb-tiles6__item { min-width: 0; display: grid; }
.tyb-tiles6__item:nth-child(1) { --t6: var(--tyb-brand); }
.tyb-tiles6__item:nth-child(2) { --t6: var(--tyb-surf-dk); }
.tyb-tiles6__item:nth-child(3) { --t6: var(--tyb-coral-dk); }

.tyb-tile6 {
	position: relative;
	display: block;
	border-radius: var(--tyb-radius5);
	color: var(--tyb-ink);
	-webkit-tap-highlight-color: transparent;
}
.tyb-tile6:hover, .tyb-tile6:focus-visible { color: var(--tyb-ink); }
.tyb-tile6__ph {
	display: block;
	aspect-ratio: 3 / 2;
	overflow: hidden;
	border-radius: var(--tyb-radius5);
	background: var(--tyb-tint-2);
}
.tyb-tile6__img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform .4s var(--tyb-ease); }
.tyb-tile6__label {
	position: relative;
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	padding: 1rem .1rem .95rem;
	border-bottom: 1px solid var(--tyb-line);
}
/* The line that draws itself under the label, in this tile's palette color. */
.tyb-tile6__label::after {
	content: '';
	position: absolute;
	left: 0; right: 0; bottom: -1px;
	height: 2px;
	background: var(--t6, var(--tyb-brand));
	transform: scaleX(0);
	transform-origin: 0 50%;
	transition: transform .4s var(--tyb-ease);
}
.tyb-tile6__name {
	font-family: var(--tyb-display);
	font-weight: 400;
	font-size: 1.5rem;
	line-height: 1.15;
	letter-spacing: -.01em;
}
.tyb-tile6 .tyb-arrow5 { width: 26px; margin-top: .5rem; color: var(--t6, var(--tyb-brand)); stroke-width: 1.4; transition: transform .4s var(--tyb-ease); }
.tyb-tile6:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 5px; }
.tyb-tile6:focus-visible .tyb-tile6__label::after { transform: scaleX(1); }
@media (hover: hover) {
	.tyb-tile6:hover .tyb-tile6__img { transform: scale(1.04); }
	.tyb-tile6:hover .tyb-arrow5 { transform: translateX(4px); }
	.tyb-tile6:hover .tyb-tile6__label::after { transform: scaleX(1); }
}
@media (max-width: 1040px) {
	.tyb-intro6 .tyb-intro5__top { grid-template-columns: minmax(0, 1fr); gap: 1rem; align-items: start; }
	.tyb-intro6 .tyb-intro5__text { max-width: 60ch; }
	.tyb-tiles6 { gap: 1rem; }
	.tyb-tile6__name { font-size: 1.25rem; }
	.tyb-tile6 .tyb-arrow5 { width: 22px; margin-top: .4rem; }
}
@media (prefers-reduced-motion: reduce) {
	.tyb-tile6__img, .tyb-tile6 .tyb-arrow5 { transition: none; }
	.tyb-tile6__label::after { transition: none; }
	.tyb-tile6:hover .tyb-tile6__img, .tyb-tile6:hover .tyb-arrow5 { transform: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the properties archive
   Adam: "move those tabs up, theres currently a big block above them. remove
   that unneeded white space."

   The block was an empty section (archive-properties.php, now gone). This is
   the one section left: the tabs sit directly under the banner, as plain
   sans-serif pills a thumb can hit, and the cards follow closely.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-arch { padding-block: 1.5rem clamp(3.5rem, 7vw, 6rem); }
.tyb-arch .tyb-search__result { margin: 0 0 1.25rem; }
.tyb-arch .tyb-filters {
	gap: .5rem;
	margin-bottom: 1.5rem;
	padding-bottom: 0;
	border-bottom: 0;
}
.tyb-arch .tyb-filter {
	min-height: 44px;
	padding: 0 1.1rem;
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	font-weight: 600;
	color: var(--tyb-ink);
}
.tyb-arch .tyb-filter.is-on { background: var(--tyb-brand); border-color: var(--tyb-brand); color: #fff; }
.tyb-arch .tyb-filter:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 2px; }
@media (hover: hover) {
	.tyb-arch .tyb-filter:not(.is-on):hover { border-color: var(--tyb-brand); color: var(--tyb-brand); }
}
@media (min-width: 641px) {
	.tyb-arch { padding-top: 2.25rem; }
	.tyb-arch .tyb-filters { margin-bottom: 2rem; }
}
@media (max-width: 640px) {
	/* One row that slides sideways if a site has five tabs; never two rows of pills. */
	.tyb-arch .tyb-filters {
		flex-wrap: nowrap;
		margin-inline: calc(var(--tyb-gutter) * -1);
		padding-inline: var(--tyb-gutter);
		overflow-x: auto;
		overscroll-behavior-x: contain;
		scrollbar-width: none;
		-webkit-overflow-scrolling: touch;
	}
	.tyb-arch .tyb-filters::-webkit-scrollbar { display: none; }
	.tyb-arch .tyb-filter { flex: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the footer's agent sign-in
   Adam: "have agent sign in link just there... make the button for it really
   nice. maybe put it on the line above the legal pages."

   One pill on its own line, directly above the legal links (footer.php):
   a lock, the words, a small arrow. White type on the dark footer, a fine
   light edge; it fills in on hover. 44px tall everywhere.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-foot__legal-in .tyb-foot__signin { margin: 14px 0 6px; }
.tyb-foot__legal-in .tyb-signin {
	display: inline-flex;
	align-items: center;
	gap: .6rem;
	min-height: 44px;
	padding: 0 1.1rem 0 .95rem;
	border: 1px solid rgba(255, 255, 255, .34);
	border-radius: 999px;
	background: rgba(255, 255, 255, .06);
	font-family: var(--tyb-body-font);
	font-size: .875rem;
	font-weight: 600;
	letter-spacing: .01em;
	line-height: 1;
	color: #fff;
	text-decoration: none;
	transition: background-color .25s var(--tyb-ease), border-color .25s var(--tyb-ease), color .25s var(--tyb-ease);
}
.tyb-signin__lock { flex: none; color: var(--tyb-gold-lt); transition: color .25s var(--tyb-ease); }
.tyb-signin__go { flex: none; opacity: .7; transition: transform .25s var(--tyb-ease), opacity .25s var(--tyb-ease); }
.tyb-foot__legal-in .tyb-signin:focus-visible { outline: 3px solid var(--tyb-gold-lt); outline-offset: 3px; }
@media (hover: hover) {
	.tyb-foot__legal-in .tyb-signin:hover { background: #fff; border-color: #fff; color: var(--tyb-deep); }
	.tyb-signin:hover .tyb-signin__lock { color: var(--tyb-deep); }
	.tyb-signin:hover .tyb-signin__go { transform: translateX(3px); opacity: 1; }
}
.tyb-foot__legal-in .tyb-signin:active { background: rgba(255, 255, 255, .16); }
@media (prefers-reduced-motion: reduce) {
	.tyb-signin, .tyb-signin__lock, .tyb-signin__go { transition: none; }
	.tyb-signin:hover .tyb-signin__go { transform: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the single property page
   Adam: "add a property too so we know its perfect."

   single-properties.php, in the home page's grammar: a large thin serif
   address, the photographs, the facts on one hairline row, the description,
   and the ask box. Phone first.

   Markup:
     article.tyb-prop >
       header.tyb-prop__head > .tyb-crumb + .tyb-prop__titles > .tyb-prop__name + .tyb-prop__money
       .tyb-prop__media > .tyb-pg.tyb-pg--n{1-5}[.is-live] > ul.tyb-pg__track > li.tyb-pg__item > button.tyb-pg__open > img
                                                           + .tyb-pg__count + button.tyb-pg__all
       dialog.tyb-lb > .tyb-lb__bar + .tyb-lb__track > figure.tyb-lb__slide + button.tyb-lb__nav
       .tyb-prop__body > ul.tyb-prop__facts + aside.tyb-prop__aside > .tyb-ask + .tyb-prop__prose
     section.tyb-pmore > .tyb-pmore__head + .tyb-pmore__grid > .tyb-card
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-prop { padding-block: 1.25rem 0; }
.tyb-prop__head { margin-bottom: 1.1rem; }
.tyb-prop .tyb-crumb { margin: 0 0 .9rem; font-size: .8125rem; color: var(--tyb-muted); }
.tyb-prop .tyb-crumb a { color: var(--tyb-ink); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--tyb-line); }

.tyb-prop__titles { display: flex; flex-direction: column; gap: .9rem; }
.tyb-prop__title {
	margin: 0;
	font-family: var(--tyb-display);
	font-weight: 400;
	font-size: clamp(2.1rem, 1.3rem + 2.9vw, 3.5rem);
	line-height: 1.02;
	letter-spacing: -.022em;
	color: var(--tyb-ink);
	text-wrap: balance;
}
.tyb-prop__town {
	margin: .55rem 0 0;
	font-size: .75rem;
	font-weight: 600;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}
.tyb-prop__money { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .9rem; }
.tyb-prop__price {
	order: -1;
	margin: 0;
	font-family: var(--tyb-display);
	font-size: clamp(1.9rem, 1.4rem + 1.9vw, 2.75rem);
	line-height: 1;
	letter-spacing: -.015em;
	color: var(--tyb-brand);
}
.tyb-prop__status {
	display: inline-flex;
	align-items: center;
	min-height: 1.75rem;
	padding: 0 .65rem;
	border-radius: 2px;
	background: var(--tyb-brand);
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: #fff;
}
.tyb-prop__status--closed { background: var(--tyb-ink); }
.tyb-prop__status--sale_pending, .tyb-prop__status--coming_soon { background: var(--tyb-coral-dk); }
.tyb-prop__repd { flex: 1 1 100%; margin: 0; font-size: .875rem; color: var(--tyb-muted); }

/* ------------------------------------------------------- the photographs -- */

.tyb-prop__media { margin-bottom: 0; }
/* No photograph: the address plate. Its ratio and its minimum height together
   made it wider than a phone (427px in a 350px column, measured), so here it
   is as wide as the column and as tall as it needs to be. */
.tyb-prop__media .tyb-plate { width: 100%; max-width: 100%; aspect-ratio: auto; min-height: clamp(13rem, 34vw, 24rem); border-radius: 10px; }
.tyb-pg { position: relative; }
.tyb-pg__track { list-style: none; margin: 0; padding: 0; }
.tyb-pg__item { min-width: 0; margin: 0; }
.tyb-pg__open {
	display: block;
	width: 100%; height: 100%;
	margin: 0; padding: 0;
	border: 0;
	border-radius: 0;
	background: var(--tyb-tint-2);
	overflow: hidden;
	cursor: default;
	-webkit-tap-highlight-color: transparent;
}
.tyb-pg.is-live .tyb-pg__open { cursor: zoom-in; }
.tyb-pg__img { display: block; width: 100%; height: 100%; aspect-ratio: 3 / 2; object-fit: cover; }
.tyb-pg__open:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: -3px; }
.tyb-pg__count, .tyb-pg__all {
	position: absolute;
	right: .75rem; bottom: .75rem;
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	border-radius: 999px;
	font-family: var(--tyb-body-font);
	font-size: .8125rem;
	font-weight: 600;
	line-height: 1;
}
.tyb-pg__count { padding: .5rem .75rem; background: rgba(12, 18, 22, .72); color: #fff; pointer-events: none; font-variant-numeric: tabular-nums; }
.tyb-pg__count b { font-weight: 600; }
.tyb-pg__all { display: none; }

@media (max-width: 899px) {
	/* One photograph at a time, edge to edge, swiped sideways. The row scrolls
	   sideways ONLY (overflow-y hidden, no touch-action override), so a finger
	   moving up or down on a photograph scrolls the page. */
	.tyb-pg { margin-inline: calc(var(--tyb-gutter) * -1); }
	.tyb-pg__track {
		display: flex;
		overflow-x: auto;
		overflow-y: hidden;
		scroll-snap-type: x mandatory;
		scrollbar-width: none;
		-webkit-overflow-scrolling: touch;
	}
	.tyb-pg__track::-webkit-scrollbar { display: none; }
	.tyb-pg__item { flex: 0 0 100%; scroll-snap-align: center; scroll-snap-stop: always; }
	.tyb-pg__open { height: auto; }
}

@media (min-width: 900px) {
	/* One large photograph and up to four beside it. With scripting on the
	   rest are in the viewer; with it off they simply follow in more rows. */
	.tyb-pg { --pg-row: clamp(150px, 16.2vw, 236px); }
	.tyb-pg__track {
		display: grid;
		grid-template-columns: minmax(0, 3fr) minmax(0, 1.1fr) minmax(0, 1.1fr);
		grid-auto-rows: var(--pg-row);
		gap: 8px;
		border-radius: 10px;
		overflow: hidden;
	}
	.tyb-pg__item:first-child { grid-column: 1; grid-row: 1 / span 2; }
	.tyb-pg__img { aspect-ratio: auto; transition: transform .6s var(--tyb-ease), filter .3s var(--tyb-ease); }
	.tyb-pg.is-live .tyb-pg__item:nth-child(n+6) { display: none; }
	/* Fewer than five: the grid still closes into one clean rectangle. */
	.tyb-pg--n1 .tyb-pg__track { grid-template-columns: minmax(0, 1fr); }
	.tyb-pg--n1 .tyb-pg__img { aspect-ratio: 16 / 9; max-height: 72vh; }
	.tyb-pg--n1 .tyb-pg__item:first-child { grid-row: auto; }
	.tyb-pg--n1 .tyb-pg__track { grid-auto-rows: auto; }
	.tyb-pg--n2 .tyb-pg__track { grid-template-columns: minmax(0, 3fr) minmax(0, 2.2fr); }
	.tyb-pg--n2 .tyb-pg__item:nth-child(2) { grid-row: 1 / span 2; }
	.tyb-pg--n3 .tyb-pg__track { grid-template-columns: minmax(0, 3fr) minmax(0, 2.2fr); }
	.tyb-pg--n4 .tyb-pg__item:nth-child(2) { grid-column: 2 / span 2; }
	.tyb-pg__count { display: none; }
	.tyb-pg.is-live .tyb-pg__all:not([hidden]) {
		display: inline-flex;
		right: 1rem; bottom: 1rem;
		min-height: 44px;
		padding: 0 1.1rem;
		border: 0;
		background: #fff;
		color: var(--tyb-ink);
		font-size: .875rem;
		cursor: pointer;
		box-shadow: 0 1px 2px rgba(12, 18, 22, .18), 0 6px 18px -8px rgba(12, 18, 22, .45);
		transition: background-color .25s var(--tyb-ease), color .25s var(--tyb-ease);
	}
	.tyb-pg__all:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }
}
@media (min-width: 900px) and (hover: hover) {
	.tyb-pg.is-live .tyb-pg__open:hover .tyb-pg__img { transform: scale(1.03); filter: brightness(.94); }
	.tyb-pg.is-live .tyb-pg__all:hover { background: var(--tyb-ink); color: #fff; }
}

/* ----------------------------------------------------------- the viewer -- */

.tyb-lb {
	width: 100vw; height: 100vh; height: 100dvh;
	max-width: none; max-height: none;
	margin: 0; padding: 0;
	border: 0;
	background: rgb(10, 14, 18);
	color: #fff;
	overflow: hidden;
}
.tyb-lb::backdrop { background: rgb(10, 14, 18); }
.tyb-lb[open] { display: flex; flex-direction: column; animation: tyb-lb-in .22s ease-out both; }
@keyframes tyb-lb-in { from { opacity: 0; } to { opacity: 1; } }
.tyb-lb__bar {
	flex: none;
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: max(.5rem, env(safe-area-inset-top)) .75rem .5rem 1.25rem;
}
.tyb-lb__count { font-size: .9375rem; font-weight: 600; font-variant-numeric: tabular-nums; }
.tyb-lb__count b { font-weight: 600; }
.tyb-lb__close, .tyb-lb__nav {
	display: grid;
	place-items: center;
	width: 48px; height: 48px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: rgba(255, 255, 255, .12);
	color: #fff;
	cursor: pointer;
	transition: background-color .2s var(--tyb-ease);
}
.tyb-lb__close:focus-visible, .tyb-lb__nav:focus-visible, .tyb-lb__track:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
.tyb-lb__track:focus-visible { outline-offset: -3px; }
.tyb-lb__track {
	flex: 1 1 auto;
	min-height: 0;
	display: flex;
	overflow-x: auto;
	overflow-y: hidden;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
	overscroll-behavior: contain;
}
.tyb-lb__track::-webkit-scrollbar { display: none; }
.tyb-lb__slide {
	flex: 0 0 100%;
	min-width: 0;
	margin: 0;
	display: grid;
	grid-template: minmax(0, 1fr) / minmax(0, 1fr);
	place-items: center;
	padding: 0 0 max(1rem, env(safe-area-inset-bottom));
	scroll-snap-align: center;
	scroll-snap-stop: always;
}
.tyb-lb__slide img { display: block; max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.tyb-lb__nav { position: absolute; top: 50%; margin-top: -24px; display: none; }
.tyb-lb__nav--prev { left: 1rem; }
.tyb-lb__nav--next { right: 1rem; }
.tyb-lb__nav[disabled] { opacity: .3; cursor: default; }
@media (min-width: 900px) {
	.tyb-lb__nav { display: grid; }
	.tyb-lb__slide { padding: 0 5.5rem 1.5rem; }
	.tyb-lb__bar { padding: 1rem 1rem .75rem 1.75rem; }
}
@media (hover: hover) {
	.tyb-lb__close:hover, .tyb-lb__nav:not([disabled]):hover { background: rgba(255, 255, 255, .26); }
}

/* ---------------------------------- the facts, the ask box, the description -- */

.tyb-prop__body { display: grid; grid-template-columns: minmax(0, 1fr); padding-block: 1.5rem 3.5rem; }

/* Only the facts the listing has, in a row of equal columns that wraps. No
   boxes: one hairline above and one below, so there is never an empty cell. */
.tyb-prop__facts {
	list-style: none;
	margin: 0;
	padding: 1.1rem 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 1.1rem .75rem;
	border-block: 1px solid var(--tyb-line);
}
.tyb-prop__facts li { min-width: 0; }
.tyb-prop__fact {
	display: block;
	font-family: var(--tyb-display);
	font-size: clamp(1.5rem, 1.2rem + 1vw, 2rem);
	line-height: 1.05;
	letter-spacing: -.01em;
	color: var(--tyb-ink);
	overflow-wrap: break-word;
}
.tyb-prop__factlabel {
	display: block;
	margin-top: .35rem;
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}

.tyb-prop__aside { margin-top: 1.5rem; }
.tyb-ask {
	border: 1px solid var(--tyb-line);
	border-radius: 14px;
	background: #fff;
	overflow: hidden;
}
/* Whose listing it is, on the brand color with the four-color rule under it. */
.tyb-ask__who {
	position: relative;
	display: flex;
	align-items: center;
	gap: .8rem;
	padding: 1rem 1.25rem 1.1rem;
	background: var(--tyb-brand);
	color: #fff;
}
.tyb-ask__who::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 4px; background: var(--tyb-rule4); }
.tyb-ask__face { flex: none; width: 48px; height: 48px; border-radius: 50%; object-fit: cover; box-shadow: 0 0 0 2px var(--tyb-gold-lt); }
.tyb-ask__id { display: flex; flex-direction: column; gap: .2rem; min-width: 0; }
.tyb-ask__name { font-family: var(--tyb-display); font-size: 1.375rem; line-height: 1.1; color: #fff; }
.tyb-ask__firm { font-size: .6875rem; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: rgba(255, 255, 255, .86); }
body.tyb-firmcase .tyb-ask__firm { text-transform: none; letter-spacing: .02em; font-size: .8125rem; }
.tyb-ask__in { padding: 1.25rem 1.25rem 1.35rem; }
.tyb-ask__title { margin: 0 0 .45rem; font-family: var(--tyb-display); font-weight: 400; font-size: 1.625rem; line-height: 1.1; letter-spacing: -.01em; color: var(--tyb-ink); }
.tyb-ask__text { margin: 0 0 1.1rem; font-size: .9375rem; line-height: 1.55; color: var(--tyb-body); }
.tyb-ask .tyb-ask__go { width: 100%; min-height: 52px; justify-content: center; }
.tyb-ask__call {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: .5rem;
	min-height: 48px;
	margin-top: .6rem;
	border: 1px solid var(--tyb-line);
	border-radius: 999px;
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	font-weight: 600;
	color: var(--tyb-ink);
	transition: border-color .25s var(--tyb-ease);
}
.tyb-ask__call .tyb-icon { color: var(--tyb-brand); }
.tyb-ask__call:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 2px; }
@media (hover: hover) { .tyb-ask__call:hover { border-color: var(--tyb-ink); color: var(--tyb-ink); } }

.tyb-prop__prose { margin-top: 2.25rem; }
.tyb-prop__h {
	margin: 0 0 1rem;
	font-family: var(--tyb-display);
	font-weight: 400;
	font-size: clamp(1.75rem, 1.4rem + 1.2vw, 2.4rem);
	line-height: 1.08;
	letter-spacing: -.015em;
	color: var(--tyb-ink);
}
.tyb-prop__prose .tyb-prose { max-width: 66ch; font-size: 1.0625rem; line-height: 1.7; color: var(--tyb-body); }
.tyb-prop__prose .tyb-prose p { margin: 0 0 1.1em; }
.tyb-prop__prose .tyb-prose p:last-child { margin-bottom: 0; }

@media (min-width: 641px) {
	.tyb-prop { padding-top: clamp(1.75rem, 3.5vw, 2.75rem); }
	.tyb-prop__head { margin-bottom: clamp(1.25rem, 2.4vw, 1.9rem); }
	.tyb-prop__titles { flex-direction: row; align-items: flex-end; justify-content: space-between; gap: 2rem; }
	.tyb-prop__money { flex: none; flex-direction: column; flex-wrap: nowrap; align-items: flex-end; gap: .6rem; text-align: right; }
	.tyb-prop__price { order: 0; }
	.tyb-prop__repd { flex: none; }
	/* From a tablet up: one row at natural widths, spread edge to edge. It
	   wraps only when a listing's facts are too long for the line. */
	.tyb-prop__facts { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 1.25rem 2rem; padding: 1.4rem 0; }
	.tyb-prop__facts li { flex: 0 1 auto; }
	.tyb-prop__fact { font-size: clamp(1.5rem, 1.1rem + .9vw, 1.875rem); white-space: nowrap; }
}
@media (min-width: 900px) {
	.tyb-prop__body {
		grid-template-columns: minmax(0, 1fr) minmax(19rem, 23rem);
		grid-template-rows: auto 1fr;
		column-gap: clamp(2.5rem, 5vw, 4.5rem);
		align-items: start;
		padding-block: clamp(2rem, 3.5vw, 3rem) clamp(4rem, 7vw, 6.5rem);
	}
	.tyb-prop__facts { grid-column: 1; grid-row: 1; }
	.tyb-prop__prose { grid-column: 1; grid-row: 2; margin-top: clamp(2.25rem, 4vw, 3.25rem); }
	/* The ask box stays in view while the text beside it scrolls. */
	.tyb-prop__aside {
		grid-column: 2; grid-row: 1 / span 2;
		position: sticky;
		top: calc(var(--tyb-bar-min) + 1.5rem);
		align-self: start;
		margin-top: 0;
	}
	.tyb-ask__in { padding: 1.5rem 1.5rem 1.6rem; }
	.tyb-ask__who { padding: 1.1rem 1.5rem 1.2rem; }
}

/* --------------------------------------------------------- more listings -- */

.tyb-pmore { background: var(--tyb-shell); padding-block: clamp(3.5rem, 7vw, 6rem); }
.tyb-pmore__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.5rem; margin-bottom: clamp(1.5rem, 3vw, 2.5rem); }
.tyb-pmore__head .tyb-h5 { margin: 0; }
.tyb-pmore__all {
	flex: none;
	display: inline-flex;
	align-items: center;
	gap: .7rem;
	min-height: 46px;
	padding: 0 1.25rem;
	border: 1px solid var(--tyb-ink);
	border-radius: 999px;
	font-size: .9rem;
	font-weight: 600;
	color: var(--tyb-ink);
	transition: background-color .25s var(--tyb-ease), color .25s var(--tyb-ease);
}
.tyb-pmore__all .tyb-arrow5 { width: 22px; }
.tyb-pmore__all:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }
@media (hover: hover) {
	.tyb-pmore__all:hover { background: var(--tyb-ink); color: #fff; }
	.tyb-pmore__all:hover .tyb-arrow5 { transform: translateX(4px); }
}
/* Three across the cards are narrow: price, street, town and the numbers
   stack, as they do on a phone. */
.tyb-pmore .tyb-card__body { grid-template-columns: minmax(0, 1fr); row-gap: .3rem; padding-top: 1rem; }
.tyb-pmore .tyb-card__price { grid-column: 1; grid-row: 1; }
.tyb-pmore .tyb-card__title { grid-column: 1; grid-row: 2; }
.tyb-pmore .tyb-card__addr { grid-column: 1; grid-row: 3; margin-top: .25rem; }
.tyb-pmore .tyb-card__specs { grid-column: 1; grid-row: 4; justify-content: flex-start; }
.tyb-pmore__grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 2.25rem; }
@media (min-width: 641px) { .tyb-pmore__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2rem 1.5rem; } }
@media (min-width: 1041px) { .tyb-pmore__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 2rem; } }
/* Two across on a tablet: the third card would sit alone, so it waits for three columns. */
@media (min-width: 641px) and (max-width: 1040px) { .tyb-pmore__grid > .tyb-card:nth-child(3) { display: none; } }
@media (max-width: 640px) {
	.tyb-pmore__head { flex-direction: column; align-items: flex-start; gap: 1rem; }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-lb[open] { animation: none; }
	.tyb-pg__img, .tyb-pg__all, .tyb-lb__close, .tyb-lb__nav, .tyb-ask__call, .tyb-pmore__all, .tyb-pmore__all .tyb-arrow5 { transition: none; }
	.tyb-pg.is-live .tyb-pg__open:hover .tyb-pg__img { transform: none; }
	.tyb-pmore__all:hover .tyb-arrow5 { transform: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — forms match the popup
   Two form styles were visible on one site: the popup (bold sans labels,
   rounded fields, a coral sans button with an arrow) and every form on a page
   (serif small-cap labels, square fields, a navy serif small-cap button). The
   popup is the newer and the one Adam asked for, so the inline form
   (.tyb-form--inline: the contact page, the valuation page, the home page's
   lead band) and the listing ask box's button take its label, field and
   button. Sizes that belong to each place (the lead band's short message box)
   are left alone.

   Rendered markup:
     form.tyb-form.tyb-form--inline > .tyb-field > label + input|textarea
     … > p.tyb-form__hint, button.tyb-btn.tyb-form__send, p.tyb-form__note
     .tyb-ask button.tyb-btn.tyb-btn--accent.tyb-ask__go
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-form--inline .tyb-field { gap: 5px; }
.tyb-form--inline .tyb-field label {
	font-family: var(--tyb-body-font);
	font-size: .8125rem;
	font-weight: 600;
	line-height: 1.3;
	letter-spacing: 0;
	text-transform: none;
	color: var(--tyb-ink);
	transition: color .15s linear;
}
.tyb-form--inline .tyb-field label span { color: inherit; }
.tyb-form--inline .tyb-field label .tyb-form__opt { font-weight: 400; font-style: normal; color: var(--tyb-muted); }
.tyb-form--inline .tyb-field:focus-within > label { color: var(--tyb-brand); }

.tyb-form--inline .tyb-field input,
.tyb-form--inline .tyb-field textarea {
	padding-inline: 14px;
	border: 1px solid var(--tyb-stone);
	border-radius: 10px;
	background: #fff;
	box-shadow: none;
	font-family: var(--tyb-body-font);
	font-size: max(1rem, 16px);
	line-height: 1.35;
	color: var(--tyb-ink);
	transition: border-color .15s linear, box-shadow .15s linear, background .15s linear;
}
.tyb-form--inline .tyb-field input { height: 50px; min-height: 50px; padding-block: 0; }
.tyb-form--inline .tyb-field textarea { padding-block: 12px; }
.tyb-form--inline .tyb-field input::placeholder,
.tyb-form--inline .tyb-field textarea::placeholder { color: var(--tyb-faint); opacity: 1; }
@media (hover: hover) {
	.tyb-form--inline .tyb-field input:hover,
	.tyb-form--inline .tyb-field textarea:hover { border-color: var(--tyb-brand); }
}
.tyb-form--inline .tyb-field input:focus,
.tyb-form--inline .tyb-field textarea:focus {
	outline: 0;
	border-color: var(--tyb-brand);
	box-shadow: 0 0 0 1px var(--tyb-brand), 0 0 0 4px var(--tyb-surf);
}
.tyb-form--inline .tyb-field input[aria-invalid="true"] {
	border-color: #B4301F;
	box-shadow: 0 0 0 1px #B4301F;
	background: #FFF8F6;
}
.tyb-form--inline .tyb-form__hint { font-size: .8125rem; line-height: 1.4; color: var(--tyb-muted); }

/* The button: the popup's. Sans, tracked, the palette's warm color, an arrow
   that is drawn (so it takes the button's own color and loads nothing). */
.tyb-form--inline .tyb-form__send,
.tyb-ask .tyb-ask__go {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	width: 100%;
	min-height: 54px;
	padding: 0 20px;
	border: 0;
	border-radius: 12px;
	background: var(--tyb-coral);
	box-shadow: 0 10px 22px -12px var(--tyb-coral-dk);
	filter: none;
	font-family: var(--tyb-body-font);
	font-size: .875rem;
	font-weight: 600;
	line-height: 1.2;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: #fff;
	transition: background .18s linear, transform .1s var(--tyb-ease), box-shadow .18s linear;
}
.tyb-form--inline .tyb-form__send:hover,
.tyb-ask .tyb-ask__go:hover {
	background: var(--tyb-coral-dk);
	border-color: transparent;
	filter: none;
	color: #fff;
	transform: none;
	box-shadow: 0 12px 24px -12px var(--tyb-coral-dk);
}
.tyb-form--inline .tyb-form__send:active,
.tyb-ask .tyb-ask__go:active { transform: scale(.985); }
.tyb-form--inline .tyb-form__send:focus-visible,
.tyb-ask .tyb-ask__go:focus-visible { outline: 2px solid var(--tyb-deep); outline-offset: 3px; }
.tyb-form--inline .tyb-form__send::after,
.tyb-ask .tyb-ask__go::after {
	content: '';
	flex: none;
	width: 18px; height: 18px;
	background: currentColor;
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'%3E%3Cpath d='M3 9h11M10 4.5L14.5 9 10 13.5' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'%3E%3Cpath d='M3 9h11M10 4.5L14.5 9 10 13.5' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
	transition: transform .2s var(--tyb-ease);
}
@media (hover: hover) {
	.tyb-form--inline .tyb-form__send:hover::after,
	.tyb-ask .tyb-ask__go:hover::after { transform: translateX(3px); }
}
.tyb-form--inline.is-sending { opacity: 1; }
.tyb-form--inline.is-sending .tyb-form__send { pointer-events: none; background: var(--tyb-coral-dk); }
@media (prefers-reduced-motion: reduce) {
	.tyb-form--inline .tyb-form__send, .tyb-form--inline .tyb-form__send::after,
	.tyb-ask .tyb-ask__go, .tyb-ask .tyb-ask__go::after { transition: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — the call pill on phones (review fix)
   The full pill (face or phone, the number, the firm) is about 215px wide at
   the bottom right of a phone, and as the page scrolled it sat on whatever
   passed under it: review bylines, the listing facts, the ask box's header.

   On a phone it now folds to its round face-or-phone button while the page
   is being scrolled DOWN past the first 200px, and opens again the moment the
   page is scrolled back up (theme.js adds .is-mini; the "call pill" block).
   Nothing is laid out again: the pill keeps its size, slides right by its own
   text and is clipped to the circle around its icon (transform + clip-path).
   theme.js measures it once: --tyb-cb-x (how far to slide), --tyb-cb-l and
   --tyb-cb-r (the clip either side of the circle).

   On a single listing the pill also stays away while the facts row or the
   ask box is on screen (two more of theme.js's "stay" zones, phones only).
   ═══════════════════════════════════════════════════════════════════════════ */

@media (max-width: 640px) {
	.tyb-callbar__call {
		clip-path: inset(-40px -40px -40px -40px round 999px);
		transition: transform .34s var(--tyb-ease), clip-path .34s var(--tyb-ease), box-shadow .22s var(--tyb-ease);
	}
	.tyb-callbar__txt { transition: opacity .18s linear; }
	.tyb-callbar__call::after { transition: opacity .18s linear; }

	.tyb-callbar.is-mini { filter: drop-shadow(0 6px 10px rgba(var(--tyb-ink-rgb), .32)); }
	.tyb-callbar.is-mini .tyb-callbar__call {
		transform: translateX(var(--tyb-cb-x, 0px));
		clip-path: inset(0 var(--tyb-cb-r, 0px) 0 var(--tyb-cb-l, 0px) round 999px);
		box-shadow: none;
	}
	.tyb-callbar.is-mini .tyb-callbar__txt,
	.tyb-callbar.is-mini .tyb-callbar__call::after { opacity: 0; }
	.tyb-callbar.is-mini .tyb-callbar__call:active { transform: translateX(var(--tyb-cb-x, 0px)) scale(.96); }
}
@media (max-width: 640px) and (prefers-reduced-motion: reduce) {
	.tyb-callbar__call, .tyb-callbar__txt, .tyb-callbar__call::after { transition: none; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 2026-10-04 — review stars and the testimonials page total (review fix)
   Stars are graphics, not text, so 3:1 is their bar (WCAG 1.4.11). Held to
   4.5:1 the gold came out a muddy olive brown on the pale cards. Each card
   now has its own star color, written by scripts/set-palette.py
   (--tyb-rvb-star, --tyb-rvs2..4-star): the palette's gold, bright. A theme
   scaffolded before these tokens falls back to the old one.

   The testimonials page prints the home section's header row (the total and
   its stars) above the cards: header.tyb-rv__head.tyb-rv__head--page.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-rvc--c1 { --rv-star: var(--tyb-rvb-star, var(--tyb-rvb-ink)); }
.tyb-rvc--c2 { --rv-star: var(--tyb-rvs2-star, var(--tyb-rv-star)); }
.tyb-rvc--c3 { --rv-star: var(--tyb-rvs3-star, var(--tyb-rv-star)); }
.tyb-rvc--c4 { --rv-star: var(--tyb-rvs4-star, var(--tyb-rv-star)); }

.tyb-rv__head--page { margin-bottom: clamp(1.5rem, 3vw, 2.25rem); }
.tyb-rv--page .tyb-filters + .tyb-rv__head--page { margin-top: 1.5rem; }


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 7 2026-10-05 — the For Sellers and For Buyers pages
   templates/sellers.php and templates/buyers.php, in the home page's language.
   New pieces: the page's ONE action as a white card half on the banner
   (parts/page-action.php, .tyb-pact7), the four steps (parts/steps.php,
   .tyb-steps7) and the questions (parts/faq-list.php, .tyb-faq7). The figures
   strip, the listings row, the review card, the town tiles and the lead band
   are the home page's own parts and keep their rules.

   Markup:
     div.tyb-pg7.tyb-pg7--sellers|--buyers
       section.tyb-pact7 > .tyb-wrap > .tyb-pact7__card > .tyb-pact7__copy + .tyb-pact7__act
       section.tyb-steps7 > .tyb-wrap > .tyb-steps7__head + ol.tyb-steps7__list > li.tyb-steps7__item
       section.tyb-faq7 > .tyb-wrap.tyb-faq7__in > .tyb-faq7__head + .tyb-faq7__list > details.tyb-faq7__item
   ═══════════════════════════════════════════════════════════════════════════ */

/* The two light grounds, given in turn by tyb_page_stack(). Two classes, so
   they win over each part's own ground wherever it was set. */
.tyb-pg7 > .tyb-ground--shell { background: var(--tyb-shell); }
.tyb-pg7 > .tyb-ground--white { background: #fff; }
.tyb-pg7 > .tyb-nums5--light { border-top: 1px solid var(--tyb-line); }

/* The banner makes room for the card that sits half on it, and a long
   headline (three towns) breaks into even lines. */
.tyb-banner:has(+ .tyb-pg7) { padding-bottom: calc(clamp(2rem, 5vh, 3rem) + 3.75rem); }
.tyb-banner:has(+ .tyb-pg7) .tyb-banner__title { text-wrap: balance; }

/* ------------------------------------------------------- the one action -- */

.tyb-pact7 {
	position: relative;
	z-index: 3;
	margin-top: -3.75rem;
	padding-bottom: clamp(.5rem, 2vw, 1.5rem);
	background: linear-gradient(to bottom, transparent 3.75rem, var(--tyb-shell) 3.75rem);
}
.tyb-pact7__card {
	position: relative;
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 35rem);
	gap: clamp(1.5rem, 4vw, 4.5rem);
	align-items: center;
	padding: clamp(1.9rem, 3.2vw, 3rem) clamp(1.5rem, 3.6vw, 3.5rem);
	background: #fff;
	border-radius: 10px;
	box-shadow: 0 1px 2px rgba(var(--tyb-scrim5), .08), 0 34px 64px -36px rgba(var(--tyb-scrim5), .5);
	overflow: hidden;
}
/* The four palette colors along its top edge. */
.tyb-pact7__card::before {
	content: '';
	position: absolute;
	inset: 0 0 auto 0;
	height: 4px;
	background: var(--tyb-rule4);
}
.tyb-pact7__copy .tyb-kick5 { margin-bottom: .9rem; }
.tyb-pact7__title {
	font-size: clamp(1.9rem, 1.35rem + 1.9vw, 2.75rem);
	line-height: 1.06;
	letter-spacing: -.02em;
	text-wrap: balance;
}
.tyb-pact7__text { margin: .8rem 0 0; max-width: 36ch; color: var(--tyb-muted); line-height: 1.55; }
.tyb-pact7__act { min-width: 0; }

/* The hero's bar on a light ground: a hairline edge, a quieter shadow, and
   the note under it in ink. */
.tyb-hero6__bar--light {
	box-shadow: 0 0 0 1px var(--tyb-line), 0 16px 32px -22px rgba(var(--tyb-scrim5), .45);
	background: var(--tyb-shell);
}
.tyb-hero6__bar--light:focus-within { box-shadow: 0 0 0 2px var(--tyb-brand), 0 16px 32px -22px rgba(var(--tyb-scrim5), .45); }
.tyb-hero6__note--light { color: var(--tyb-muted); opacity: 1; text-shadow: none; }

/* The Buyers page's one button. */
.tyb-pact7__go {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.25rem;
	width: 100%;
	min-height: 64px;
	padding: .95rem 1.6rem;
	border: 0;
	border-radius: 8px;
	background: var(--tyb-coral);
	color: #fff;
	font: 600 .875rem/1.3 var(--tyb-body-font);
	letter-spacing: .08em;
	text-transform: uppercase;
	text-align: left;
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
	transition: background .2s var(--tyb-ease), transform .08s var(--tyb-ease);
}
.tyb-pact7__go .tyb-arrow5 { width: 26px; }
@media (hover: hover) {
	.tyb-pact7__go:hover { background: var(--tyb-coral-dk); }
	.tyb-pact7__go:hover .tyb-arrow5 { transform: translateX(5px); }
}
.tyb-pact7__go:focus-visible { background: var(--tyb-coral-dk); outline: 2px solid var(--tyb-deep); outline-offset: 3px; }
.tyb-pact7__go:active { transform: scale(.99); }

@media (max-width: 899px) {
	.tyb-banner:has(+ .tyb-pg7) { padding-bottom: calc(clamp(2rem, 5vh, 3rem) + 2.75rem); }
	.tyb-pact7 { margin-top: -2.75rem; background: linear-gradient(to bottom, transparent 2.75rem, var(--tyb-shell) 2.75rem); }
	.tyb-pact7__card { grid-template-columns: minmax(0, 1fr); gap: 1.4rem; }
	.tyb-pact7__card .tyb-hero6__bar { max-width: none; }
	.tyb-pact7__text { max-width: none; }
}

/* ---------------------------------------------------------- the four steps -- */

@media (min-width: 641px) {
	.tyb-steps7, .tyb-faq7 { padding-block: var(--tyb-band5); }
}
.tyb-steps7__head { margin-bottom: clamp(2.25rem, 4.6vw, 4.25rem); }
.tyb-steps7__list {
	--gap7: clamp(1.25rem, 2.8vw, 3rem);
	list-style: none;
	margin: 0; padding: 0;
	display: grid;
	grid-template-columns: repeat(var(--tyb-n, 4), minmax(0, 1fr));
	column-gap: var(--gap7);
	row-gap: 2.75rem;
}
.tyb-steps7__item { position: relative; min-width: 0; }
/* The icon in a disc of one palette color, by position. The icon itself is
   the dark ink on a pale wash, so it reads in any palette. */
.tyb-steps7__mark {
	position: relative;
	z-index: 1;
	display: grid;
	place-items: center;
	width: 76px; height: 76px;
	border-radius: 50%;
	background: var(--tyb-brand-pale);
	color: var(--tyb-deep);
}
.tyb-steps7__mark .tyb-li { width: 30px; height: 30px; stroke-width: 1.4; }
.tyb-steps7__item:nth-child(4n+2) .tyb-steps7__mark { background: var(--tyb-rvs2-bg, var(--tyb-surf-pale)); }
.tyb-steps7__item:nth-child(4n+3) .tyb-steps7__mark { background: var(--tyb-rvs3-bg, var(--tyb-coral-pale)); }
.tyb-steps7__item:nth-child(4n+4) .tyb-steps7__mark { background: var(--tyb-rvs4-bg, var(--tyb-dune-pale)); }
/* One hairline through the row, from each disc to the next. */
.tyb-steps7__item::before {
	content: '';
	position: absolute;
	top: 38px;
	left: 92px;
	right: calc(16px - var(--gap7));
	height: 1px;
	background: var(--tyb-line);
}
.tyb-steps7__item:last-child::before { right: 0; background: linear-gradient(to right, var(--tyb-line), transparent); }
.tyb-steps7__num {
	display: block;
	margin-top: 1.6rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem; font-weight: 600; line-height: 1.4; letter-spacing: .26em;
	color: var(--tyb-muted);
}
.tyb-steps7__title {
	margin: .45rem 0 .65rem;
	font-size: clamp(1.5rem, 1.2rem + .9vw, 2rem);
	line-height: 1.08;
	letter-spacing: -.015em;
}
.tyb-steps7__text { margin: 0; max-width: 32ch; font-size: .975rem; line-height: 1.6; color: var(--tyb-muted); }

@media (max-width: 1040px) and (min-width: 641px) {
	.tyb-steps7__list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.tyb-steps7__item:nth-child(even)::before { right: 0; background: linear-gradient(to right, var(--tyb-line), transparent); }
}
/* A phone: the steps go down one line, the icon at the left of each. */
@media (max-width: 640px) {
	.tyb-steps7__list { grid-template-columns: minmax(0, 1fr); row-gap: 0; }
	.tyb-steps7__item { display: grid; grid-template-columns: 56px minmax(0, 1fr); column-gap: 1.15rem; padding-bottom: 2rem; }
	.tyb-steps7__item:last-child { padding-bottom: 0; }
	.tyb-steps7__mark { width: 56px; height: 56px; }
	.tyb-steps7__mark .tyb-li { width: 24px; height: 24px; }
	.tyb-steps7__item::before,
	.tyb-steps7__item:last-child::before {
		top: 64px; bottom: 8px; left: 28px; right: auto;
		width: 1px; height: auto;
		background: var(--tyb-line);
	}
	.tyb-steps7__item:last-child::before { display: none; }
	.tyb-steps7__num { margin-top: .35rem; }
	.tyb-steps7__title { margin: .3rem 0 .45rem; font-size: 1.5rem; }
	.tyb-steps7__text { max-width: none; font-size: 1rem; }
}

/* ------------------------------------------------------------ the questions -- */

.tyb-faq7__in {
	display: grid;
	grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
	gap: clamp(2rem, 6vw, 6.5rem);
	align-items: start;
}
.tyb-faq7__photo {
	margin-top: clamp(1.75rem, 3.2vw, 2.75rem);
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: var(--tyb-radius5);
	background: var(--tyb-tint);
}
.tyb-faq7__img { width: 100%; height: 100%; object-fit: cover; }
.tyb-faq7__list { border-top: 1px solid var(--tyb-line); }
/* With no photograph the left column is only a heading: line the first
   question up with it. */
.tyb-faq7:not(.tyb-faq7--photo) .tyb-faq7__list { margin-top: .4rem; }
.tyb-faq7__item { border-bottom: 1px solid var(--tyb-line); }
.tyb-faq7__q {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.25rem;
	min-height: 76px;
	padding: 1.1rem 0;
	list-style: none;
	cursor: pointer;
	font-family: var(--tyb-display);
	font-size: clamp(1.3rem, 1.12rem + .65vw, 1.7rem);
	line-height: 1.18;
	letter-spacing: -.01em;
	color: var(--tyb-ink);
	-webkit-tap-highlight-color: transparent;
}
.tyb-faq7__q::-webkit-details-marker { display: none; }
.tyb-faq7__q::marker { content: ''; }
.tyb-faq7__q .tyb-li {
	flex: none;
	width: 24px; height: 24px;
	padding: 9px;
	box-sizing: content-box;
	border: 1px solid var(--tyb-line);
	border-radius: 50%;
	color: var(--tyb-ink);
	stroke-width: 1.4;
	transition: transform .3s var(--tyb-ease), background-color .2s var(--tyb-ease), color .2s var(--tyb-ease), border-color .2s var(--tyb-ease);
}
.tyb-faq7__item[open] > .tyb-faq7__q .tyb-li { transform: rotate(45deg); background: var(--tyb-ink); border-color: var(--tyb-ink); color: #fff; }
@media (hover: hover) {
	.tyb-faq7__q:hover .tyb-li { border-color: var(--tyb-ink); }
}
.tyb-faq7__q:focus-visible { outline: 2px solid var(--tyb-brand); outline-offset: 4px; border-radius: 4px; }
.tyb-faq7__a { margin: 0; padding: 0 4rem 1.75rem 0; max-width: 60ch; color: var(--tyb-body); line-height: 1.65; }
.tyb-faq7__more { margin: 2rem 0 0; }
.tyb-faq7__ask {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: .8rem;
	min-height: 52px;
	padding: 0 1.5rem;
	border: 1px solid var(--tyb-ink);
	border-radius: 999px;
	background: transparent;
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	font-weight: 600;
	color: var(--tyb-ink);
	cursor: pointer;
	transition: background-color .25s var(--tyb-ease), color .25s var(--tyb-ease);
}
.tyb-faq7__ask .tyb-arrow5 { width: 22px; }
@media (hover: hover) {
	.tyb-faq7__ask:hover { background: var(--tyb-ink); color: #fff; }
	.tyb-faq7__ask:hover .tyb-arrow5 { transform: translateX(4px); }
}
.tyb-faq7__ask:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }

@media (max-width: 899px) {
	.tyb-faq7__in { grid-template-columns: minmax(0, 1fr); gap: 1.75rem; }
	.tyb-faq7__photo { aspect-ratio: 16 / 9; margin-top: 1.5rem; }
	.tyb-faq7__a { padding-right: 0; }
	.tyb-faq7__q { min-height: 68px; }
	.tyb-faq7__ask { width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-faq7__q .tyb-li, .tyb-pact7__go, .tyb-pact7__go .tyb-arrow5, .tyb-faq7__ask, .tyb-faq7__ask .tyb-arrow5 { transition: none; }
}
/* The listings row with only one or two homes (an agent's sold-as-listing-
   side set is often that small). The home page's row is two large cards and
   the edge of a third; with no third, two cards share the content column and
   one card is a single large picture, and the arrows have nothing to do. */
@media (min-width: 901px) {
	.tyb-pg7 .tyb-list5 .tyb-slider__track:has(> .tyb-slider__slide:nth-child(2):last-child) {
		grid-auto-columns: calc((100% - 2rem) / 2);
		margin-right: 0; padding-right: 0;
	}
	.tyb-pg7 .tyb-list5 .tyb-slider__track:has(> .tyb-slider__slide:only-child) {
		grid-auto-columns: min(100%, 52rem);
		margin-right: 0; padding-right: 0;
	}
	.tyb-pg7 .tyb-slider:has(.tyb-slider__slide:nth-child(2):last-child) .tyb-slider__btn { display: none; }
}
.tyb-pg7 .tyb-slider:has(.tyb-slider__slide:only-child) .tyb-slider__btn { display: none; }

/* ═════════════ end ROUND 7 2026-10-05 — the For Sellers and For Buyers pages ═════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 7 2026-10-05 — the solo About page and the headshot frames
   templates/about-solo.php (one About page when team() has ONE member) and
   the places a face goes. The reviews, the listings row, the town tiles, the
   questions and the lead band on that page are the home page's own parts and
   keep their rules; only the top of the page is new.

   Markup (parts/about-hero.php):
     div.tyb-pg7.tyb-pg7--about
       section.tyb-ab7.tyb-ab7--portrait|--scene|--team|--nophoto > .tyb-wrap.tyb-ab7__in
         .tyb-ab7__media > figure.tyb-ab7__frame > img
         .tyb-ab7__body > .tyb-kick5 + h1.tyb-ab7__name + .tyb-ab7__role + .tyb-ab7__lic
                          + .tyb-ab7__bio + ul.tyb-ab7__badges + .tyb-ab7__acts > a.tyb-ab7__btn

   THE FRAME FOLLOWS THE FILE (feedback_headshot_frames). The portrait file is
   4:5 (1200x1500), so the frame is 4:5 here AND on the home page's "meet"
   section (it was 5:7, which cut the sides of a 4:5 file). object-position is
   top, so if a build drops in a taller file the cut comes off the bottom,
   never the crown.
   ═══════════════════════════════════════════════════════════════════════════ */

/* The home page's portrait: 4:5, the shape of the file. */
.tyb-meet5 .tyb-split__media--portrait img { aspect-ratio: 4 / 5; object-position: 50% 0; }

/* The phone hero's kicker with the face. The 44px disc made the kicker row
   26px taller than the words alone, which pushed the H1 to 225px (the first
   screen wants it inside 200). The row moves up by that much, into the clear
   photograph under the masthead, so the H1 sits where it does with no face. */
@media (max-width: 640px) {
	.tyb-hero6__kicker--face { margin-top: -1.75rem; }
	/* The shade follows the kicker up by the same 28px, so the small capitals
	   keep the strength they were measured at. */
	.tyb-hero6:has(.tyb-hero6__kicker--face) .tyb-hero__scrim {
		background: linear-gradient(to bottom, rgba(12, 18, 22, .1) 0, rgba(12, 18, 22, .14) 56px, rgba(12, 18, 22, .32) 112px, rgba(12, 18, 22, .54) 144px, rgba(12, 18, 22, .6) 100%);
	}
}

.tyb-ab7 { padding-block: clamp(2.75rem, 5.5vw, 5.25rem) clamp(3.5rem, 7vw, 6.5rem); }
.tyb-ab7__in {
	display: grid;
	grid-template-columns: minmax(0, .84fr) minmax(0, 1fr);
	gap: clamp(3rem, 7vw, 7.5rem);
	align-items: center;
}
/* No photograph at all: the words alone, on a readable measure. */
.tyb-ab7--nophoto .tyb-ab7__in { grid-template-columns: minmax(0, 46rem); }

/* The offset color frame is a shadow, so the column keeps 14px for it. */
.tyb-ab7__media { max-width: 31rem; padding: 0 14px 14px 0; }
.tyb-ab7--scene .tyb-ab7__media,
.tyb-ab7--team .tyb-ab7__media { max-width: none; }
.tyb-ab7__frame { margin: 0; }
.tyb-ab7__frame img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--tyb-radius5);
	box-shadow: 14px 14px 0 0 var(--tyb-gold);
}
.tyb-ab7--portrait .tyb-ab7__frame img { aspect-ratio: 4 / 5; object-fit: cover; object-position: 50% 0; }

.tyb-ab7__body { min-width: 0; }
.tyb-ab7__body .tyb-kick5 { margin-bottom: 1.1rem; }
.tyb-ab7 .tyb-ab7__name {
	max-width: none;
	font-size: clamp(2.7rem, 1.5rem + 4.3vw, 5.1rem);
	line-height: .98;
}
.tyb-ab7__role {
	margin: 1rem 0 0;
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .22em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}
/* A firm whose casing must survive (profile()['firm_case']). */
.tyb-firmcase .tyb-ab7__role { text-transform: none; letter-spacing: .04em; font-size: .9rem; }
.tyb-ab7__lic { margin: .45rem 0 0; font-size: .875rem; color: var(--tyb-muted); }
.tyb-ab7__bio {
	margin-top: 1.7rem;
	max-width: 48ch;
	font-size: clamp(1rem, .95rem + .28vw, 1.15rem);
	line-height: 1.7;
	color: var(--tyb-body);
}
.tyb-ab7__bio p { margin: 0; }
.tyb-ab7__bio p + p { margin-top: .85em; }

/* Badges: the home page's hairline list. */
.tyb-ab7__badges {
	list-style: none;
	margin: 1.8rem 0 0;
	padding: 0;
	max-width: 30rem;
	border-bottom: 1px solid var(--tyb-line);
}
.tyb-ab7__badges li {
	padding: .8rem 0;
	border-top: 1px solid var(--tyb-line);
	font-size: .95rem;
	font-weight: 500;
	line-height: 1.35;
	color: var(--tyb-ink);
}

/* Call and email: two buttons, a filled icon in each. */
.tyb-ab7__acts { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: 1.9rem; }
.tyb-ab7__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: .7rem;
	min-height: 56px;
	padding: 0 1.6rem;
	border: 1px solid transparent;
	border-radius: 8px;
	font-family: var(--tyb-body-font);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1;
	white-space: nowrap;
	transition: background-color .25s var(--tyb-ease), color .25s var(--tyb-ease), border-color .25s var(--tyb-ease);
}
.tyb-ab7__btn svg { flex: none; width: 18px; height: 18px; fill: currentColor; }
/* The icon class carries its own pale color; in a button it takes the button's. */
.tyb-ab7__btn .tyb-icon { color: inherit; }
.tyb-ab7__btn--call { background: var(--tyb-coral); color: #fff; font-variant-numeric: tabular-nums; }
.tyb-ab7__btn--mail { border-color: var(--tyb-ink); color: var(--tyb-ink); background: transparent; }
@media (hover: hover) {
	.tyb-ab7__btn--call:hover { background: var(--tyb-coral-dk); color: #fff; }
	.tyb-ab7__btn--mail:hover { background: var(--tyb-ink); color: #fff; }
}
.tyb-ab7__btn:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }
.tyb-ab7__firm.tyb-firmtag { display: block; margin-top: .9rem; }

@media (max-width: 900px) {
	.tyb-ab7__in { grid-template-columns: minmax(0, 1fr); gap: 2.25rem; }
	.tyb-ab7__media { max-width: 21rem; margin-inline: auto; padding: 0 10px 10px 0; }
	.tyb-ab7--scene .tyb-ab7__media,
	.tyb-ab7--team .tyb-ab7__media { max-width: none; margin-inline: 0; }
	.tyb-ab7__frame img { box-shadow: 10px 10px 0 0 var(--tyb-gold); }
}
@media (max-width: 640px) {
	.tyb-ab7 { padding-top: 2rem; }
	.tyb-ab7__media { max-width: 16.5rem; }
	.tyb-ab7__bio { margin-top: 1.3rem; line-height: 1.6; }
	.tyb-ab7__badges { margin-top: 1.4rem; }
	.tyb-ab7__acts { flex-direction: column; margin-top: 1.5rem; }
	.tyb-ab7__btn { width: 100%; }
}
@media (prefers-reduced-motion: reduce) {
	.tyb-ab7__btn { transition: none; }
}

/* ═══════ end ROUND 7 2026-10-05 — the solo About page and the headshot frames ═══════ */

/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 7 2026-10-05 — color templates
   The pieces a color template recolors read TOKENS and nothing else. The
   popup's panel color lives in the first :root (the phone menu's tile colors
   did too, until round 9 removed the tiles), and the ink in the round 5 and round 7 shadows is
   rgba(var(--tyb-ink-rgb), …). The rule below takes the popup stars off
   the raw fourth color and onto a pair scripts/set-palette.py measures:
   --tyb-pop-star on --tyb-pop-ground. (The two rules that did the same for
   the menu's icon discs went with the discs in round 8.)
   ═══════════════════════════════════════════════════════════════════════════ */
.tyb-pop__stars { color: var(--tyb-pop-star); }

/* ═══════ end ROUND 7 2026-10-05 — color templates ═══════ */

/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 7 2026-10-05 — the Buyers page search action (review fix)
   An IDX site (hero()['action'] = 'search') prints the property search in the
   action card (.tyb-pact7--search). Beside the heading it had 35rem: the
   price and bedroom fields were cut to "No" and "An", and the form's own
   glass panel drew a card inside the card. Here the heading sits above and
   the search takes the card's full width, with no panel of its own.
   ═══════════════════════════════════════════════════════════════════════════ */
.tyb-pact7--search .tyb-pact7__card { grid-template-columns: minmax(0, 1fr); gap: clamp(1.1rem, 2.2vw, 1.75rem); }
.tyb-pact7--search .tyb-pact7__text { max-width: 60ch; }
.tyb-pact7--search .tyb-search--hero {
	padding: 0;
	background: none;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
}
.tyb-pact7--search .tyb-search--hero .tyb-search__field input,
.tyb-pact7--search .tyb-search--hero .tyb-search__field select { border-color: var(--tyb-line); }

/* ═══════ end ROUND 7 2026-10-05 — the Buyers page search action (review fix) ═══════ */

/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 7 2026-10-05 — the questions accordion in Safari (review fix)
   Safari draws a <summary>'s disclosure triangle through its own
   pseudo-element, which ::marker does not reach (the search form's "More
   filters" already hides it the same way). Without this an iPhone can show
   a small triangle before every question beside the plus icon.
   ═══════════════════════════════════════════════════════════════════════════ */
.tyb-faq7__q::-webkit-details-marker { display: none; }

/* ═══════ end ROUND 7 2026-10-05 — the questions accordion in Safari (review fix) ═══════ */

/* ═══════════════════════════════════════════════════════════════════════
   ROUND 7 2026-10-05 — review fixes on phones: the accordion's plus and the
   footer's Explore links

   1. The folded call pill sits bottom right, exactly where the accordion's
      plus buttons were, so at most scroll positions it covered one of them.
      At 760px and under the plus moves to the LEFT of the question and the
      answer lines up under the question's words. Nothing a thumb has to hit
      is under the pill any more.
      Markup: details.tyb-faq7__item > summary.tyb-faq7__q > span + svg.tyb-li,
      then p.tyb-faq7__a.
   2. (The footer's Explore list: two equal columns in reading order. ROUND 8
      2026-10-05 redid the phone footer and those rules moved into its block,
      "ROUND 8 2026-10-05 — simpler menu, footer", F8.)
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 760px) {
	.tyb-faq7__q { flex-direction: row-reverse; justify-content: flex-end; gap: 1rem; }
	.tyb-faq7__a { padding-left: calc(44px + 1rem); }
}
/* ROUND 7 2026-10-05 — review fixes on phones: the accordion's plus and the footer's Explore links ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 8 2026-10-05 — simpler menu, footer
   (The menu half of this block, the soft-tint tiles, was removed in ROUND 9
   2026-10-05 with the rest of the tile menu: see the four "ROUND 9 2026-10-05
   — the phone menu" blocks at the end of this file.) THE FOOTER (F8) is what
   is left here.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ───────────────────────────────── F8: the footer on phones, the sign-in pill
   Adam: "I also don't like how the menu is positioned on the footer in the
   mobile version. The 'Home Sell About Buy Properties Contact' just looks
   kind of off." and "The color of the lock on the agent sign-in… I don't know
   why it's yellow."

   F8.1 (phones). One arrangement, and the ONLY rules for it (round 7's
   two-column fix was folded in here and removed there): Explore is two even
   columns in MENU order (Home, Buy / Sell, Properties / …), every row 44px
   with a hairline under it, on the same left edge and the same width as
   "Get in touch", whose phone and email rows keep the same rhythm. About
   24px shorter, by spacing alone.
   F8.2 (every width). The lock, the arrow and the pill's edge follow the
   label's own ink: white on the dark footer, the deep color on hover. No gold.
   ─────────────────────────────────────────────────────────────────────────── */

.tyb-signin__lock { color: currentColor; opacity: .82; }
.tyb-signin__go { opacity: .82; }
.tyb-foot__legal-in .tyb-signin { border-color: rgba(255, 255, 255, .42); }
.tyb-foot__legal-in .tyb-signin:focus-visible { outline-color: currentColor; }
@media (hover: hover) {
	.tyb-signin:hover .tyb-signin__lock { color: currentColor; opacity: 1; }
}

/* 641px to 760px: still two columns, in reading order (never CSS columns, which run down first) */
@media (max-width: 760px) {
	.tyb-foot__menu { columns: auto; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 24px; }
}

@media (max-width: 640px) {
	/* both blocks take the whole width: one left edge, one measure */
	.tyb-foot__col { flex: 1 1 100%; }
	.tyb-foot__in { gap: 24px; padding-block: 34px 30px; }
	.tyb-foot__h { margin-bottom: 8px; }

	.tyb-foot__menu li { border-bottom: 1px solid rgba(255, 255, 255, .13); }
	.tyb-foot__menu li:nth-child(-n+2) { border-top: 1px solid rgba(255, 255, 255, .13); }
	/* REVIEW 2026-10-05: an odd count (seven links) left the last one alone in the left column over a
	   half-width rule. It takes both columns, so the closing rule runs the full width. */
	.tyb-foot__menu li:last-child:nth-child(odd) { grid-column: 1 / -1; }
	.tyb-foot__menu a,
	.tyb-foot__link { display: flex; align-items: center; min-height: 44px; padding-block: 0; }

	/* the contact rows: the same 44px and the same hairlines as the links above */
	.tyb-foot .tyb-firmtag { margin-bottom: 8px; }
	.tyb-foot__link { border-bottom: 1px solid rgba(255, 255, 255, .13); }
	.tyb-foot__link:first-of-type { border-top: 1px solid rgba(255, 255, 255, .13); }
	.tyb-foot__addr { margin-top: 12px; }
}

/* ═══════ end ROUND 8 2026-10-05 — simpler menu, footer ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the phone menu: what the three styles share
   parts/mobile-menu.php, tyb_menu() in functions.php, the menu block of
   theme.js. ONE markup, three looks. The round-5 / round-8 tile menu is gone
   (Adam: "a little bit too much… too many buttons crowd the space… these are
   getting a bit too colorful i just want hints of color… this is a real estate
   website for a realtor broker or brokerage not a daycare website").

   A build picks a style in the content class:  profile()['menu'] =
     'slate'  a full-screen charcoal ground, white capitals in one column
     'paper'  an ivory panel from the right, large serif names on ruled lines
     'sheet'  a compact white card rising from the bottom edge
   and the root element takes .tyb-menu--<style>. Each style has its own block
   below this one; nothing here has a color in it.

   Every style reads the same six variables, set in its own block:
     --tyb-menu-ground  --tyb-menu-ink   --tyb-menu-quiet (pages in a section)
     --tyb-menu-soft (the firm line)     --tyb-menu-hair  --tyb-menu-accent
   The accent appears as the current-page mark and, at most, one button.

   Tokens scripts/set-palette.py writes in the first :root (hex, no color-mix;
   each use below has a fallback, so a theme scaffolded earlier still renders):
     --tyb-menu-slate  the slate style's ground: the ink's hue at 5% saturation
                       or less and 13.5% lightness. Grey in every palette.
     --tyb-menu-mark   the mark on that ground: the button color lightened until
                       it is 3:1 on it; white when the palette has no hue.
     --tyb-menu-fill   a quiet opaque grey (white with 7% of the ink): the
                       sheet style's Call button and X disc.

   States: .tyb-menu.is-open (script) or .tyb-menu:not(.is-js):target (the
   burger is a link to #tyb-menu, so with JavaScript off every page is still
   reachable, each section's pages listed under it). html.tyb-menu-on while
   open: the burger's three bars cross. .is-js, .is-fold / .is-push (how a
   section opens), .tyb-menu__item.is-open, .tyb-menu__sub.is-open,
   .is-pressed, .is-dragging, .is-more / .is-scrolled (the list can scroll
   further down / has been scrolled). Only transform and opacity are animated.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-menu {
	--tyb-menu-out:  cubic-bezier(.16, 1, .3, 1);    /* arriving: a long soft landing */
	--tyb-menu-in:   cubic-bezier(.4, 0, 1, 1);      /* leaving */
	--tyb-menu-away: .28s;                           /* the box stays in the tree until the close has played */

	position: fixed;
	inset: 0;
	z-index: 300;
	visibility: hidden;
	pointer-events: none;
	transition: visibility 0s linear var(--tyb-menu-away);
	font-family: var(--tyb-body-font);
	-webkit-font-smoothing: antialiased;
	-webkit-tap-highlight-color: transparent;
	-webkit-text-size-adjust: 100%;
	text-size-adjust: 100%;
}
.tyb-menu:focus { outline: none; }

.tyb-menu.is-open,
.tyb-menu:not(.is-js):target {
	visibility: visible;
	pointer-events: auto;
	transition-delay: 0s;
}

/* the desktop navigation takes over */
@media (min-width: 1041px) {
	.tyb-menu { display: none; }
}

/* the floating call pill steps aside while the menu is open */
html.tyb-menu-on .tyb-callbar { opacity: 0; visibility: hidden; pointer-events: none; transition: opacity .12s linear, visibility 0s linear .12s; }

/* ------------------------------------------------- the burger becomes an X */

.tyb-burger__box i,
.tyb-menu__bars i { transition: transform .3s cubic-bezier(.16, 1, .3, 1), opacity .16s linear; }

html.tyb-menu-on .tyb-burger__box i:nth-child(1),
.tyb-menu.is-open .tyb-menu__bars i:nth-child(1),
.tyb-menu:not(.is-js) .tyb-menu__bars i:nth-child(1) { transform: translateY(6px) rotate(45deg); }
html.tyb-menu-on .tyb-burger__box i:nth-child(2),
.tyb-menu.is-open .tyb-menu__bars i:nth-child(2),
.tyb-menu:not(.is-js) .tyb-menu__bars i:nth-child(2) { opacity: 0; transform: scaleX(.3); }
html.tyb-menu-on .tyb-burger__box i:nth-child(3),
.tyb-menu.is-open .tyb-menu__bars i:nth-child(3),
.tyb-menu:not(.is-js) .tyb-menu__bars i:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* ------------------------------------------------------- the dim, the panel */

.tyb-menu__scrim {
	position: absolute;
	inset: 0;
	opacity: 0;
	transition: opacity .2s linear;
	cursor: default;
}
.tyb-menu.is-open .tyb-menu__scrim,
.tyb-menu:not(.is-js):target .tyb-menu__scrim { opacity: 1; }

.tyb-menu__panel {
	position: absolute;
	display: flex;
	flex-direction: column;
	isolation: isolate;
	color: var(--tyb-menu-ink);
}
/* the panel's ground is its own box, so one style can move it apart from what sits on it */
.tyb-menu__ground {
	position: absolute;
	inset: 0;
	z-index: -1;
	border-radius: inherit;
	background: var(--tyb-menu-ground);
	pointer-events: none;
}
.tyb-menu__ground i { display: none; }

/* under a finger nothing eases: the panel is where the finger is */
.tyb-menu.is-dragging .tyb-menu__panel,
.tyb-menu.is-dragging .tyb-menu__scrim { transition: none !important; }

/* ---------------------------------------------------------------- the head */

.tyb-menu__head { position: relative; flex: none; display: flex; align-items: center; }
.tyb-menu__handle { display: none; }

.tyb-menu__close {
	flex: none;
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	color: var(--tyb-menu-ink);
	text-decoration: none;
}
.tyb-menu__close:hover { color: var(--tyb-menu-ink); }
.tyb-menu__bars { display: block; width: 18px; }
.tyb-menu__bars i { display: block; height: 1.5px; border-radius: 1px; background: currentColor; }
.tyb-menu__bars i + i { margin-top: 4.5px; }

.tyb-menu__who { min-width: 0; margin: 0; display: flex; align-items: center; }
.tyb-menu__face { flex: none; border-radius: 50%; object-fit: cover; }
.tyb-menu__id { min-width: 0; display: block; }
.tyb-menu__name,
.tyb-menu__firm { display: block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.tyb-menu__name { color: var(--tyb-menu-ink); }
.tyb-menu__firm { color: var(--tyb-menu-soft); }

/* two languages: the other one, as a quiet text link beside the name */
.tyb-menu__lang { flex: none; display: flex; gap: 12px; margin: 0 12px; font-size: 12px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; }
.tyb-menu__langopt { display: grid; place-items: center; min-width: 44px; min-height: 44px; color: var(--tyb-menu-soft); text-decoration: none; }
.tyb-menu__langopt:hover { color: var(--tyb-menu-ink); }
.tyb-menu__langopt.is-on { display: none; }

/* ---------------------------------------------------------------- the list */

.tyb-menu__nav {
	position: relative;
	flex: 1 1 auto;
	min-height: 0;
	display: flex;
	flex-direction: column;
	overflow: hidden;
}
.tyb-menu__list,
.tyb-menu__sublist { list-style: none; margin: 0; padding: 0; }
.tyb-menu__list {
	flex: 1 1 auto;
	min-height: 0;
	overflow-x: hidden;
	overflow-y: auto;
	overscroll-behavior: contain;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
}
.tyb-menu__list::-webkit-scrollbar,
.tyb-menu__sub::-webkit-scrollbar { display: none; }

.tyb-menu__item,
.tyb-menu__subitem { position: relative; margin: 0; padding: 0; }

.tyb-menu__link,
.tyb-menu__sublink,
.tyb-menu__back {
	position: relative;
	display: flex;
	align-items: center;
	margin: 0;
	border: 0;
	border-radius: 0;
	background: none;
	font-family: inherit;
	text-align: left;
	text-decoration: none;
	cursor: pointer;
	-webkit-appearance: none;
	appearance: none;
}
.tyb-menu__link,
.tyb-menu__link:hover,
.tyb-menu__back,
.tyb-menu__back:hover { color: var(--tyb-menu-ink); }
.tyb-menu__sublink,
.tyb-menu__sublink:hover { color: var(--tyb-menu-quiet); }
.tyb-menu__link { justify-content: space-between; min-height: var(--tyb-menu-row, 56px); }
.tyb-menu__label { min-width: 0; overflow-wrap: break-word; }

/* Round 9 review: the site's links ease their COLOR on hover (a global rule on
   every <a>). Inside the menu only opacity and transform ever move. */
.tyb-menu__close,
.tyb-menu__link,
.tyb-menu__sublink,
.tyb-menu__back,
.tyb-menu__call,
.tyb-menu__value,
.tyb-menu__langopt { transition-property: opacity, transform; }

/* the sign that a row has pages inside: a chevron, or a plus (the style picks one) */
.tyb-menu__more { flex: none; display: none; place-items: center; }
.tyb-menu.is-js .tyb-menu__more { display: grid; }
.tyb-menu__chev { display: block; }
.tyb-menu__pm { position: relative; display: none; width: 14px; height: 14px; }
.tyb-menu__pm i { position: absolute; left: 0; top: 50%; width: 14px; height: 1.5px; margin-top: -.75px; background: currentColor; }

/* the pages inside a section. No script: listed under it. .is-fold: they open in
   place. .is-push: they are a second level laid over the list (the sheet style). */
.tyb-menu__sub { position: relative; }
.tyb-menu.is-fold .tyb-menu__sub:not(.is-open) { display: none; }
.tyb-menu__back { display: none; }
.tyb-menu__rule { display: none; position: absolute; left: 0; width: 1px; transform-origin: 50% 0; }

/* while a section opens or closes, the rows under it travel as one opaque block
   and uncover (or cover) its pages. Height is never animated. */
.tyb-menu__item.is-moving { z-index: 1; background: var(--tyb-menu-ground); }
/* closing: its pages leave the flow at once, so the rows below can rise over them */
.tyb-menu__sub.is-leaving { position: absolute; left: 0; right: 0; top: var(--tyb-menu-subtop, 100%); margin-bottom: 0; }

/* ------------------------------------------------------------- the actions */

.tyb-menu__foot { position: relative; flex: none; display: flex; }
.tyb-menu__call,
.tyb-menu__value {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 52px;
	text-align: center;
	text-decoration: none;
}

/* ------------------------------------------------------------------- focus */

.tyb-menu a:focus,
.tyb-menu button:focus { outline: none; }
.tyb-menu a:focus-visible,
.tyb-menu button:focus-visible { outline: 2px solid var(--tyb-menu-ink); outline-offset: -3px; }

/* ---------------------------------------------------------- reduced motion
   Nothing in the menu transitions at all. The theme's global rule gives every
   element "transition-duration: .01ms"; visibility is inherited, so for that
   instant the X still counts as hidden and the focus call does nothing (met in
   round 8). The menu is simply there, and simply gone. */
@media (prefers-reduced-motion: reduce) {
	.tyb-menu,
	.tyb-menu *,
	.tyb-menu *::before,
	.tyb-menu *::after,
	.tyb-burger__box i,
	html.tyb-menu-on .tyb-callbar { transition: none !important; animation: none !important; }
}
/* ═══════ end ROUND 9 2026-10-05 — the phone menu: what the three styles share ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the phone menu, style "slate"
   The one Adam remembers ("a grey background and just white text stacked with
   a nice accordion type of animation that made them all appear in a row"),
   rebuilt. A full-screen charcoal ground; white capitals in one column, each
   row falling into place after the one above it; a row with pages inside opens
   in place; the X is the burger's own three bars, crossing where they are; the
   two actions sit quietly at the bottom.

   The only color on the screen is the short bar beside the page you are on
   (--tyb-menu-mark). The ground is --tyb-menu-slate: grey in every palette,
   never the brand color.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-menu--slate {
	--tyb-menu-ground: var(--tyb-menu-slate, #212324);
	--tyb-menu-ink:    #fff;
	--tyb-menu-quiet:  rgba(255, 255, 255, .86);
	--tyb-menu-soft:   rgba(255, 255, 255, .66);
	--tyb-menu-hair:   rgba(255, 255, 255, .12);
	--tyb-menu-accent: var(--tyb-menu-mark, #fff);
	--tyb-menu-theme:  var(--tyb-menu-slate, #212324);   /* the browser bar takes it while the menu is open */
	--tyb-menu-row:    58px;
	--tyb-menu-g:      28px;                             /* the edge every label sits on */
	--tyb-menu-xr:     var(--tyb-menu-x-right, 20px);    /* the burger's distance from the right edge (theme.js) */
	--tyb-menu-away:   .27s;
}

.tyb-menu--slate .tyb-menu__scrim { display: none; }

.tyb-menu--slate .tyb-menu__panel {
	inset: 0;
	height: 100%;
	height: 100dvh;
	overflow: hidden;
}
/* the ground fades in first; on the way out the rows go, then the ground */
.tyb-menu--slate.is-js .tyb-menu__panel { opacity: 0; transition: opacity .18s linear .09s; }
.tyb-menu--slate.is-open .tyb-menu__panel { opacity: 1; transition: opacity .16s linear; }

/* ----------------------------------------------------------------- top bar */

.tyb-menu--slate .tyb-menu__head {
	justify-content: space-between;
	gap: 16px;
	min-height: 44px;
	margin-top: var(--tyb-menu-x-top, 16px);
	margin-top: max(var(--tyb-menu-x-top, 16px), env(safe-area-inset-top, 0px));
	padding-left: var(--tyb-menu-g);
	padding-left: max(var(--tyb-menu-g), env(safe-area-inset-left, 0px));
	padding-right: var(--tyb-menu-xr);
}
/* the X is first in the source (first in the tab order) and last on the row: where the burger is */
.tyb-menu--slate .tyb-menu__close { order: 3; border-radius: 6px; }
.tyb-menu--slate .tyb-menu__lang { order: 2; margin: 0; }
.tyb-menu--slate .tyb-menu__who { order: 1; flex: 1 1 auto; gap: 12px; }
/* the name waits until the ground is opaque, so it never ghosts beside the masthead's wordmark */
.tyb-menu--slate.is-js .tyb-menu__who { opacity: 0; transition: opacity .09s linear; }
.tyb-menu--slate.is-open .tyb-menu__who { opacity: 1; transition: opacity .26s linear .16s; }

.tyb-menu--slate .tyb-menu__face { width: 36px; height: 36px; }
.tyb-menu--slate .tyb-menu__id { display: grid; gap: 3px; }
.tyb-menu--slate .tyb-menu__name { font-size: 11.5px; font-weight: 600; line-height: 1.2; letter-spacing: .16em; text-transform: uppercase; }
.tyb-menu--slate .tyb-menu__firm {
	font-size: 13px;
	font-weight: 400;
	line-height: 1.25;
	letter-spacing: .01em;
	/* a long firm name takes a second line and is not cut (a state's advertising rule may want it whole) */
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	white-space: normal;
}

/* ---------------------------------------------------------------- the list */

.tyb-menu--slate .tyb-menu__list { padding: calc(22px + var(--tyb-menu-lift, 0px)) 0 10px; }

/* a long list fades only where there is more of it: at the foot while it can
   still scroll down, at the top once it has been scrolled (theme.js) */
.tyb-menu--slate.is-more .tyb-menu__list {
	-webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 40px), transparent);
	mask-image: linear-gradient(to bottom, #000 calc(100% - 40px), transparent);
}
.tyb-menu--slate.is-scrolled .tyb-menu__list {
	-webkit-mask-image: linear-gradient(to bottom, transparent, #000 18px);
	mask-image: linear-gradient(to bottom, transparent, #000 18px);
}
.tyb-menu--slate.is-scrolled.is-more .tyb-menu__list {
	-webkit-mask-image: linear-gradient(to bottom, transparent, #000 18px, #000 calc(100% - 40px), transparent);
	mask-image: linear-gradient(to bottom, transparent, #000 18px, #000 calc(100% - 40px), transparent);
}

/* the rows arrive one after another, each falling 16px into its place
   (theme.js sets --tyb-menu-d: the gaps shrink a little down the list) */
.tyb-menu--slate.is-js .tyb-menu__item {
	opacity: 0;
	transform: translate3d(0, -16px, 0);
	transition: opacity .09s linear, transform 0s linear .27s;    /* leaving: all together, no travel */
}
.tyb-menu--slate.is-open .tyb-menu__item {
	opacity: 1;
	transform: none;
	transition: opacity .28s linear var(--tyb-menu-d, calc(120ms + var(--i, 0) * 38ms)),
	            transform .42s var(--tyb-menu-out) var(--tyb-menu-d, calc(120ms + var(--i, 0) * 38ms));
}

.tyb-menu--slate .tyb-menu__link {
	gap: 16px;
	padding: 8px var(--tyb-menu-xr) 8px var(--tyb-menu-g);
	padding-left: max(var(--tyb-menu-g), env(safe-area-inset-left, 0px));
	font-size: 23px;
	font-weight: 600;
	line-height: 1.16;
	letter-spacing: .07em;
	text-transform: uppercase;
}
.tyb-menu--slate .tyb-menu__label { transition: opacity .12s linear, transform .2s var(--tyb-menu-out); }
/* a label that needs two lines keeps its size and takes more air (theme.js marks it) */
.tyb-menu--slate .tyb-menu__link.is-long { line-height: 1.24; padding-top: 12px; padding-bottom: 12px; }
/* a press answers: the label eases 4px along and dims */
.tyb-menu--slate .tyb-menu__link.is-pressed .tyb-menu__label { opacity: .72; transform: translate3d(4px, 0, 0); }

/* The page you are on: a thin bar just left of its word, the one piece of color.
   (Round 9 review: it used to sit on the screen's very edge, 28px from the word
   and under a phone case.) Inside a section the bar is on the page itself
   (below); if that section has been closed, its own row carries it. */
.tyb-menu--slate .tyb-menu__item.is-current > .tyb-menu__link::before,
.tyb-menu--slate .tyb-menu__item.has-current:not(.is-open) > .tyb-menu__link::before {
	content: "";
	position: absolute;
	left: calc(var(--tyb-menu-g) - 14px);
	left: calc(max(var(--tyb-menu-g), env(safe-area-inset-left, 0px)) - 14px);
	top: 50%;
	width: 2px;
	height: 22px;
	margin-top: -11px;
	border-radius: 1px;
	background: var(--tyb-menu-accent);
}

/* the chevron sits on the X's center line, and flips */
.tyb-menu--slate .tyb-menu__more { width: 44px; height: 24px; color: rgba(255, 255, 255, .74); transition: transform .3s var(--tyb-menu-out); }
.tyb-menu--slate .tyb-menu__link[aria-expanded="true"] .tyb-menu__more { transform: scaleY(-1); }

/* --------------------------------------------- the pages inside a section */

.tyb-menu--slate .tyb-menu__sub {
	margin: 0 var(--tyb-menu-g) 10px var(--tyb-menu-g);
	margin-left: max(var(--tyb-menu-g), env(safe-area-inset-left, 0px));
	padding-left: 18px;
}
.tyb-menu--slate .tyb-menu__sub.is-leaving { margin-bottom: 0; }
.tyb-menu--slate .tyb-menu__rule { display: block; top: 8px; bottom: 8px; background: rgba(255, 255, 255, .18); }

/* Round 9 review: the pages inside a section speak the list's own voice, one
   size down (they were the serif in mixed case: a second voice on a ground
   that is otherwise "just white text stacked", and the faintest text on it). */
.tyb-menu--slate .tyb-menu__sublink {
	min-height: 52px;
	margin-left: -12px;
	padding: 6px 12px;
	font-family: inherit;
	font-size: 15px;
	font-weight: 500;
	line-height: 1.25;
	letter-spacing: .1em;
	text-transform: uppercase;
}
.tyb-menu--slate .tyb-menu__sublink[aria-current],
.tyb-menu--slate .tyb-menu__sublink[aria-current]:hover { color: #fff; }
.tyb-menu--slate .tyb-menu__sublink.is-pressed { opacity: .72; }
/* the page you are on, inside a section: the same color, on the group's rule */
.tyb-menu--slate .tyb-menu__sublink[aria-current]::before {
	content: "";
	position: absolute;
	left: -7px;
	top: 50%;
	width: 2px;
	height: 16px;
	margin-top: -8px;
	border-radius: 1px;
	background: var(--tyb-menu-accent);
}

/* -------------------------------------------------------- the two actions */

.tyb-menu--slate .tyb-menu__foot {
	gap: 10px;
	margin: 0 var(--tyb-menu-g);
	margin-left: max(var(--tyb-menu-g), env(safe-area-inset-left, 0px));
	/* the right edge of the rule and of the button is the X's and the chevron's (13px = the X's inset in its 44px chip) */
	margin-right: calc(var(--tyb-menu-xr) + 13px);
	margin-right: max(calc(var(--tyb-menu-xr) + 13px), env(safe-area-inset-right, 0px));
	padding: 16px 0 20px;
	padding-bottom: max(20px, env(safe-area-inset-bottom, 0px));
	border-top: 1px solid var(--tyb-menu-hair);
}
.tyb-menu--slate.is-js .tyb-menu__foot > * {
	opacity: 0;
	transform: translate3d(0, -8px, 0);
	transition: opacity .09s linear, transform 0s linear .27s;
}
.tyb-menu--slate.is-open .tyb-menu__foot > * {
	opacity: 1;
	transform: none;
	transition: opacity .28s linear var(--tyb-menu-df, calc(150ms + var(--n, 6) * 38ms)),
	            transform .42s var(--tyb-menu-out) var(--tyb-menu-df, calc(150ms + var(--n, 6) * 38ms));
}

/* both speak the list's own voice, small: tracked capitals. Neither is colored. */
.tyb-menu--slate .tyb-menu__call,
.tyb-menu--slate .tyb-menu__value {
	padding: 8px 14px;
	border-radius: 2px;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.25;
	letter-spacing: .12em;
	text-transform: uppercase;
}
.tyb-menu--slate .tyb-menu__num { display: none; }
.tyb-menu--slate .tyb-menu__call,
.tyb-menu--slate .tyb-menu__call:hover { flex: 0 0 auto; min-width: 104px; color: #fff; border: 1px solid rgba(255, 255, 255, .3); }
.tyb-menu--slate .tyb-menu__call:only-child { flex: 1 1 auto; }
.tyb-menu--slate .tyb-menu__value,
.tyb-menu--slate .tyb-menu__value:hover { flex: 1 1 0; min-width: 0; color: var(--tyb-menu-ground); background: #EFEDE8; }
.tyb-menu--slate .tyb-menu__call.is-pressed,
.tyb-menu--slate .tyb-menu__value.is-pressed { opacity: .78; }

.tyb-menu--slate a:focus-visible { outline-color: #fff; outline-offset: -2px; border-radius: 4px; }
.tyb-menu--slate .tyb-menu__sublink:focus-visible { outline-offset: 0; }
.tyb-menu--slate .tyb-menu__close:focus-visible,
.tyb-menu--slate .tyb-menu__call:focus-visible { outline-offset: 2px; }
.tyb-menu--slate .tyb-menu__value:focus-visible { outline-offset: 3px; }

/* ------------------------------------------------------------------- sizes */

/* seven rows or more: a little tighter, so eight still fit a 664px screen */
.tyb-menu--slate.tyb-menu--many { --tyb-menu-row: 56px; }
.tyb-menu--slate.tyb-menu--many .tyb-menu__link { font-size: 21px; }

/* a tall phone: larger type and more air, so the list is not timid on it */
@media (min-height: 780px) {
	.tyb-menu--slate { --tyb-menu-row: 68px; }
	.tyb-menu--slate .tyb-menu__list { padding-top: calc(40px + var(--tyb-menu-lift, 0px)); }
	.tyb-menu--slate .tyb-menu__link { font-size: 26px; letter-spacing: .07em; }
	.tyb-menu--slate .tyb-menu__sublink { font-size: 16px; min-height: 54px; }
	.tyb-menu--slate.tyb-menu--many { --tyb-menu-row: 62px; }
	.tyb-menu--slate.tyb-menu--many .tyb-menu__link { font-size: 22px; }
}
/* Round 9 review: 360x640 with a section open, Contact's row ran 3px under the buttons */
@media (max-height: 660px) {
	.tyb-menu--slate { --tyb-menu-row: 56px; }
}
@media (max-height: 599px) {
	.tyb-menu--slate { --tyb-menu-row: 52px; }
	.tyb-menu--slate .tyb-menu__list { padding-top: 12px; padding-bottom: 28px; }
	.tyb-menu--slate .tyb-menu__link { font-size: 21px; }
	.tyb-menu--slate .tyb-menu__foot { padding-top: 12px; padding-bottom: max(14px, env(safe-area-inset-bottom, 0px)); }
}
@media (max-width: 374px) {
	.tyb-menu--slate { --tyb-menu-g: 24px; }
	.tyb-menu--slate .tyb-menu__call,
	.tyb-menu--slate .tyb-menu__value { letter-spacing: .1em; }
}

/* a tablet: the same slate, one large column down the left, the chevron beside its word */
@media (min-width: 700px) and (min-height: 500px) {
	.tyb-menu--slate { --tyb-menu-g: var(--tyb-gutter, 32px); --tyb-menu-row: 76px; }
	.tyb-menu--slate .tyb-menu__list { padding-top: calc(44px + var(--tyb-menu-lift, 0px)); }
	.tyb-menu--slate .tyb-menu__link,
	.tyb-menu--slate.tyb-menu--many .tyb-menu__link { font-size: 32px; justify-content: flex-start; gap: 14px; }
	.tyb-menu--slate .tyb-menu__more { width: 24px; }
	.tyb-menu--slate .tyb-menu__sublink { font-size: 18px; min-height: 58px; }
	.tyb-menu--slate .tyb-menu__name { font-size: 13px; }
	.tyb-menu--slate .tyb-menu__firm { font-size: 14px; }
	.tyb-menu--slate .tyb-menu__face { width: 44px; height: 44px; }
	.tyb-menu--slate .tyb-menu__foot { width: 460px; max-width: calc(100% - 2 * var(--tyb-menu-g)); margin-right: auto; padding-bottom: max(32px, env(safe-area-inset-bottom, 0px)); }
	.tyb-menu--slate .tyb-menu__call,
	.tyb-menu--slate .tyb-menu__value { font-size: 13px; }
}

/* a phone on its side: the list down the left, the two actions stacked at the right */
@media (max-height: 499px) and (min-width: 560px) {
	.tyb-menu--slate { --tyb-menu-row: 52px; }
	.tyb-menu--slate .tyb-menu__panel {
		display: grid;
		grid-template-columns: minmax(0, 1fr) 248px;
		grid-template-rows: auto minmax(0, 1fr);
	}
	.tyb-menu--slate .tyb-menu__head { grid-column: 1 / -1; }
	.tyb-menu--slate .tyb-menu__nav { grid-column: 1; grid-row: 2; }
	.tyb-menu--slate .tyb-menu__list { padding: 4px 0 28px; }
	.tyb-menu--slate .tyb-menu__link,
	.tyb-menu--slate.tyb-menu--many .tyb-menu__link { font-size: 20px; justify-content: flex-start; gap: 14px; }
	.tyb-menu--slate .tyb-menu__more { width: 24px; }
	.tyb-menu--slate .tyb-menu__foot {
		grid-column: 2;
		grid-row: 2;
		align-self: end;
		flex-direction: column;
		margin: 0 calc(var(--tyb-menu-xr) + 13px) 0 0;
		margin-right: max(calc(var(--tyb-menu-xr) + 13px), env(safe-area-inset-right, 0px));
		padding: 0 0 max(20px, env(safe-area-inset-bottom, 0px));
		border-top: 0;
	}
	.tyb-menu--slate .tyb-menu__call,
	.tyb-menu--slate .tyb-menu__value { flex: none; min-height: 48px; }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-menu--slate.is-js .tyb-menu__item,
	.tyb-menu--slate.is-js .tyb-menu__foot > *,
	.tyb-menu--slate .tyb-menu__link.is-pressed .tyb-menu__label { transform: none; }
}
/* ═══════ end ROUND 9 2026-10-05 — the phone menu, style "slate" ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the phone menu, style "paper"
   Light and editorial: a full-height ivory panel (the site's own shell color)
   slides in from the right while the page behind dims. Large serif page names
   on ruled lines, each word rising onto its rule after the one above. A
   section opens in place (plus becomes minus). The X lands where the burger was.

   Color: the accent appears twice and nowhere else: the short bar at the
   panel's edge beside the page you are on, and the one filled button.
   Tokens: --tyb-shell, --tyb-ink, --tyb-body, --tyb-muted, --tyb-line,
   --tyb-accent, --tyb-ink-rgb (the dim and the edge shadow).
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-menu--paper {
	--tyb-menu-ground: var(--tyb-shell, #FCF8F1);
	--tyb-menu-ink:    var(--tyb-ink, #10161C);
	--tyb-menu-quiet:  var(--tyb-body, #394854);
	--tyb-menu-soft:   var(--tyb-muted, #525F69);
	--tyb-menu-hair:   var(--tyb-line, #E4DED2);
	--tyb-menu-accent: var(--tyb-accent, #10161C);
	--tyb-menu-out:    cubic-bezier(.22, 1, .36, 1);
	--tyb-menu-row:    60px;
	--tyb-menu-pad:    24px;                             /* the left edge of every line of type */
	--tyb-menu-xr:     var(--tyb-menu-x-right, 20px);    /* the burger's distance from the right edge (theme.js) */
	--tyb-menu-away:   .28s;
	overflow: hidden;
	overflow: clip;
}

/* strong enough that the strip of page left showing is a shade, not a second picture */
.tyb-menu--paper .tyb-menu__scrim { background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .58); }

.tyb-menu--paper .tyb-menu__panel {
	top: 0;
	right: 0;
	bottom: 0;
	width: min(88vw, 360px);
	padding-right: env(safe-area-inset-right, 0px);
	/* a sideways drag closes it; up and down still scrolls the list */
	touch-action: pan-y;
}
.tyb-menu--paper .tyb-menu__ground {
	box-shadow: -1px 0 0 rgba(var(--tyb-ink-rgb, 16, 22, 28), .06), -28px 0 56px -8px rgba(var(--tyb-ink-rgb, 16, 22, 28), .22);
}
.tyb-menu--paper.is-js .tyb-menu__panel { transform: translate3d(104%, 0, 0); transition: transform .26s var(--tyb-menu-in); }
.tyb-menu--paper.is-open .tyb-menu__panel { transform: none; transition: transform .38s var(--tyb-menu-out); }

/* ------------------------------------------------------------ the head */

.tyb-menu--paper .tyb-menu__head {
	align-items: flex-start;
	min-height: var(--tyb-menu-head, 64px);
	padding: 0 var(--tyb-menu-xr) 0 var(--tyb-menu-pad);
	border-bottom: 1px solid var(--tyb-menu-hair);
	box-sizing: border-box;
}
/* the X is first in the source and sits at the right, at the burger's own height (theme.js) */
.tyb-menu--paper .tyb-menu__close {
	order: 3;
	margin-top: var(--tyb-menu-x-top, 10px);
	margin-top: max(var(--tyb-menu-x-top, 10px), env(safe-area-inset-top, 0px));
	border-radius: 50%;
}
.tyb-menu--paper .tyb-menu__close.is-pressed { background-color: rgba(var(--tyb-ink-rgb, 16, 22, 28), .06); }
.tyb-menu--paper .tyb-menu__lang { order: 2; align-self: center; margin: 0 4px 0 0; }
.tyb-menu--paper .tyb-menu__who { order: 1; flex: 1 1 auto; align-self: center; padding: 10px 12px 10px 0; }
/* a letterhead: the name, and the firm under it, in small tracked capitals. No portrait here. */
.tyb-menu--paper .tyb-menu__face { display: none; }
.tyb-menu--paper .tyb-menu__name,
.tyb-menu--paper .tyb-menu__firm { font-size: 11px; line-height: 1.45; text-transform: uppercase; }
.tyb-menu--paper .tyb-menu__name { font-weight: 600; letter-spacing: .1em; }
/* the firm may take a second line and is never cut (a state's advertising rule may want it whole) */
.tyb-menu--paper .tyb-menu__firm { font-weight: 500; letter-spacing: .08em; white-space: normal; text-wrap: balance; }

/* ------------------------------------------------------------ the list */

.tyb-menu--paper .tyb-menu__item {
	/* opaque: when a section opens, the rows under it slide down off its pages */
	background: var(--tyb-menu-ground);
	border-bottom: 1px solid var(--tyb-menu-hair);
}

/* The ruled lines are on the panel as it comes in. The words follow, each
   rising 10px onto its rule, 50ms apart, once the panel has mostly landed. */
.tyb-menu--paper.is-js .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper.is-js .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper.is-js .tyb-menu__foot > * {
	opacity: 0;
	transform: translate3d(0, 10px, 0);
	transition: opacity 0s linear .28s, transform 0s linear .28s;     /* reset once the panel has left */
}
.tyb-menu--paper.is-open .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper.is-open .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper.is-open .tyb-menu__foot > * {
	opacity: 1;
	transform: none;
	transition: opacity .2s linear, transform .32s var(--tyb-menu-out);
	transition-delay: calc(130ms + var(--i, 0) * 50ms);
}
/* the two at the bottom come together, one beat after the last page name */
.tyb-menu--paper .tyb-menu__foot > * { --i: var(--n, 6); }
/* the button is the largest colored thing: it travels in, it does not wash in */
.tyb-menu--paper.is-open .tyb-menu__foot > .tyb-menu__value { transition: opacity .12s linear, transform .32s var(--tyb-menu-out); transition-delay: calc(130ms + var(--n, 6) * 50ms); }

.tyb-menu--paper .tyb-menu__link { padding: 8px var(--tyb-menu-pad); }
.tyb-menu--paper .tyb-menu__label {
	display: block;
	font-family: var(--tyb-display);
	font-size: 28px;
	line-height: 1.08;
	font-weight: 400;
	letter-spacing: -.005em;
}

/* a finger on a row: the paper takes the faintest shade */
.tyb-menu--paper .tyb-menu__link::before {
	content: '';
	position: absolute;
	inset: 0;
	background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .045);
	opacity: 0;
	transition: opacity .25s linear;
	pointer-events: none;
}
.tyb-menu--paper .tyb-menu__link.is-pressed::before { opacity: 1; transition-duration: 0s; }

/* The page you are on: a short accent bar at the paper's edge, arriving just
   after its word. The first of the two places the accent appears. */
.tyb-menu--paper .tyb-menu__item.is-current > .tyb-menu__link::after,
.tyb-menu--paper .tyb-menu__item.has-current > .tyb-menu__link::after {
	content: '';
	position: absolute;
	left: 0;
	top: 50%;
	width: 3px;
	height: 24px;
	margin-top: -12px;
	background: var(--tyb-menu-accent);
}
.tyb-menu--paper.is-js .tyb-menu__link::after { opacity: 0; transition: opacity 0s linear .28s; }
.tyb-menu--paper.is-open .tyb-menu__link::after { opacity: 1; transition: opacity .24s linear; transition-delay: calc(210ms + var(--i, 0) * 50ms); }

/* plus becomes minus */
.tyb-menu--paper .tyb-menu__more { width: 14px; height: 14px; margin-left: 16px; }
.tyb-menu--paper .tyb-menu__chev { display: none; }
.tyb-menu--paper .tyb-menu__pm { display: block; }
.tyb-menu--paper .tyb-menu__pm i { transition: transform .3s var(--tyb-menu-out); }
.tyb-menu--paper .tyb-menu__pm i + i { transform: rotate(90deg); }
.tyb-menu--paper .tyb-menu__link[aria-expanded="true"] .tyb-menu__pm i + i { transform: rotate(0deg); }

/* ------------------------------------------------- pages inside a section */

.tyb-menu--paper .tyb-menu__sub { margin-left: var(--tyb-menu-pad); padding: 0 0 10px; }
.tyb-menu--paper .tyb-menu__sub.is-leaving { left: var(--tyb-menu-pad); margin-left: 0; }
.tyb-menu--paper .tyb-menu__rule { display: block; top: 4px; bottom: 16px; background: var(--tyb-menu-hair); }
.tyb-menu--paper .tyb-menu__sublink {
	min-height: 52px;
	padding: 6px var(--tyb-menu-pad) 6px 18px;
	font-size: 16px;
	line-height: 1.25;
	font-weight: 400;
	letter-spacing: 0;
}
.tyb-menu--paper .tyb-menu__sublink.is-pressed { background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .045); }
.tyb-menu--paper .tyb-menu__sublink[aria-current],
.tyb-menu--paper .tyb-menu__sublink[aria-current]:hover { color: var(--tyb-menu-ink); font-weight: 600; }

/* ------------------------------------------------------------- the foot */

.tyb-menu--paper .tyb-menu__foot {
	flex-direction: column;
	gap: 6px;
	padding: 8px var(--tyb-menu-pad) 16px;
	padding-bottom: max(16px, env(safe-area-inset-bottom, 0px));
	/* no rule of its own: the list ends on its last row's rule */
	background: var(--tyb-menu-ground);
}
/* more pages below than fit: the row behind dissolves into the foot (theme.js sets .is-more) */
.tyb-menu--paper .tyb-menu__foot::before {
	content: '';
	position: absolute;
	left: 0;
	right: 0;
	bottom: 100%;
	height: 56px;
	background: linear-gradient(to top, var(--tyb-menu-ground) 15%, transparent);
	opacity: 0;
	transition: opacity .2s linear;
	pointer-events: none;
}
.tyb-menu--paper.is-more .tyb-menu__foot::before { opacity: 1; }

.tyb-menu--paper .tyb-menu__call,
.tyb-menu--paper .tyb-menu__call:hover {
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
	padding: 16px 0 0;
	color: var(--tyb-menu-ink);
}
.tyb-menu--paper .tyb-menu__calllabel { font-size: 11px; line-height: 1.3; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--tyb-menu-soft); }
.tyb-menu--paper .tyb-menu__num { font-family: var(--tyb-display); font-size: 23px; line-height: 1; letter-spacing: .005em; white-space: nowrap; }
.tyb-menu--paper .tyb-menu__call.is-pressed { opacity: .7; }

/* The one filled button: the second and last place the accent appears. */
.tyb-menu--paper .tyb-menu__value,
.tyb-menu--paper .tyb-menu__value:hover {
	padding: 8px 16px;
	border-radius: 4px;
	background: var(--tyb-menu-accent);
	color: #fff;
	font-size: 13.5px;
	line-height: 1.2;
	font-weight: 600;
	letter-spacing: .06em;
	text-transform: uppercase;
}
.tyb-menu--paper .tyb-menu__value.is-pressed { filter: brightness(.94); }
.tyb-menu--paper .tyb-menu__value:focus-visible { outline-offset: 3px; }

/* --------------------------------------------------------------- the fit */

@media (max-height: 700px) {
	.tyb-menu--paper { --tyb-menu-row: 56px; }
	.tyb-menu--paper .tyb-menu__sub { padding-bottom: 4px; }      /* 390x664 with a section open: Contact's rule stays above the foot */
}
/* Round 9 review: a 640px-tall phone (360x640) with a section open. The 52px
   rows used to start at 600px, so here Contact left the screen. */
@media (max-height: 660px) {
	.tyb-menu--paper { --tyb-menu-row: 52px; }
	.tyb-menu--paper .tyb-menu__label { font-size: 26px; }
	.tyb-menu--paper .tyb-menu__sub { padding-bottom: 4px; }
	.tyb-menu--paper .tyb-menu__foot { padding-top: 4px; }
	.tyb-menu--paper .tyb-menu__call { padding-top: 10px; }
}
/* a tall phone: larger names and more air per row, so the page is not half empty */
@media (min-height: 800px) {
	.tyb-menu--paper { --tyb-menu-row: 72px; }
	.tyb-menu--paper .tyb-menu__label { font-size: 32px; }
	.tyb-menu--paper .tyb-menu__list { padding-top: 12px; }
	.tyb-menu--paper .tyb-menu__sublink { font-size: 17px; min-height: 54px; }
}
/* seven rows or more on a tall phone: the ordinary size, or the eighth leaves the screen */
@media (min-height: 800px) {
	.tyb-menu--paper.tyb-menu--many { --tyb-menu-row: 64px; }
	.tyb-menu--paper.tyb-menu--many .tyb-menu__label { font-size: 29px; }
}
/* a short phone (375x548): tighter rows; the number and the button share one row */
@media (max-height: 600px) {
	.tyb-menu--paper { --tyb-menu-row: 52px; }
	.tyb-menu--paper .tyb-menu__label { font-size: 26px; }
	.tyb-menu--paper .tyb-menu__foot { flex-direction: row; align-items: center; gap: 14px; padding-top: 12px; padding-bottom: max(12px, env(safe-area-inset-bottom, 0px)); }
	.tyb-menu--paper .tyb-menu__call { flex: 0 0 auto; justify-content: flex-start; align-items: center; padding: 0; }
	.tyb-menu--paper .tyb-menu__calllabel { display: none; }
	.tyb-menu--paper .tyb-menu__num { font-size: 20px; }
	.tyb-menu--paper .tyb-menu__value { flex: 1 1 auto; padding: 8px 10px; font-size: 12.5px; letter-spacing: .05em; }
	.tyb-menu--paper .tyb-menu__call:only-child { flex: 1 1 auto; min-height: 52px; }
}
@media (max-width: 374px) {
	.tyb-menu--paper { --tyb-menu-pad: 22px; }
	.tyb-menu--paper .tyb-menu__num { font-size: 22px; }
}
@media (max-width: 374px) and (max-height: 600px) {
	.tyb-menu--paper .tyb-menu__num { font-size: 19px; }
	.tyb-menu--paper .tyb-menu__value { font-size: 12px; padding: 8px 8px; letter-spacing: .03em; }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-menu--paper.is-js .tyb-menu__panel,
	.tyb-menu--paper.is-js .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper.is-js .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper.is-js .tyb-menu__foot > * { transform: none; }
}
/* ═══════ end ROUND 9 2026-10-05 — the phone menu, style "paper" ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the phone menu, style "sheet"
   The smallest and quickest: a white card that rises from the bottom edge the
   way a system sheet does on an iPhone, the page still in view above it. From
   600px wide the same card hangs under the burger.

     head    a drag handle; the agent's name in the site's serif with the firm
             in small capitals under it; a small round X
     list    one row per page, hairlines between; the page you are on is
             heavier, with a short accent tab at the card's edge
     level 2 a row with pages inside slides the list away and brings its pages
             in from the right under a back row; the card's top edge comes down
             to fit them (the ground and the head move, by transform; the two
             buttons stay where the thumb is)
     dock    one row: Call, and Get my home value (the ONE colored thing)

   The ground is white at 98.5% over a blur of the page: opaque enough that
   nothing behind ghosts through. Ink, muted and the accent come from the
   palette. Pull the card down to close it (phones).
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-menu--sheet {
	--tyb-menu-ground: rgba(255, 255, 255, .985);
	--tyb-menu-ink:    var(--tyb-ink, #10161C);
	--tyb-menu-quiet:  var(--tyb-body, #394854);
	--tyb-menu-soft:   var(--tyb-muted, #525F69);
	--tyb-menu-hair:   rgba(var(--tyb-ink-rgb, 16, 22, 28), .1);
	--tyb-menu-accent: var(--tyb-coral-dk, #10161C);     /* white on it is 4.5:1 or better in every template */
	--tyb-menu-plate:  var(--tyb-menu-fill, #EEF0F2);    /* Call, the X's disc, a pressed row */
	--tyb-menu-out:    cubic-bezier(.32, .72, 0, 1);     /* the iOS sheet curve */
	--tyb-menu-push:   cubic-bezier(.22, 1, .36, 1);     /* level 1 <-> level 2, and the rows */
	--tyb-menu-row:    54px;
	--tyb-menu-pad:    20px;
	--tyb-menu-away:   .26s;
}

/* The page stays in view above the card, dimmed enough that the card sits above
   it and does not compete with the headline behind (round 9 review: .26 left the
   hero fully legible against the card's top edge). */
.tyb-menu--sheet .tyb-menu__scrim { background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .42); transition-duration: .18s; }

.tyb-menu--sheet .tyb-menu__panel {
	left: max(8px, env(safe-area-inset-left, 0px));
	right: max(8px, env(safe-area-inset-right, 0px));
	bottom: calc(8px + env(safe-area-inset-bottom, 0px));
	max-height: calc(100% - 72px - env(safe-area-inset-bottom, 0px));
	border-radius: 26px;
}
.tyb-menu--sheet.is-js .tyb-menu__panel {
	transform: translate3d(0, calc(100% + 28px + env(safe-area-inset-bottom, 0px)), 0);
	transition: transform .24s var(--tyb-menu-in);
}
.tyb-menu--sheet.is-open .tyb-menu__panel { transform: translate3d(0, 0, 0); transition: transform .32s var(--tyb-menu-out); }

/* The card's ground is a fill inside a rounded window. The window keeps the
   card's shape and place; the fill can slide down inside it (level 2, below),
   so the card gets shorter with no height animated and its foot never moves.
   The shadow is its own box and slides with the fill. */
.tyb-menu--sheet .tyb-menu__ground { background: none; overflow: hidden; }
.tyb-menu--sheet .tyb-menu__ground i {
	display: block;
	position: absolute;
	inset: 0;
	border-radius: inherit;
	background: #FBFBFA;      /* where the browser cannot blur */
}
@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
	.tyb-menu--sheet .tyb-menu__ground i {
		background: var(--tyb-menu-ground);
		-webkit-backdrop-filter: blur(40px) saturate(1.1);
		backdrop-filter: blur(40px) saturate(1.1);
	}
}
.tyb-menu--sheet .tyb-menu__panel::before {
	content: '';
	position: absolute;
	inset: 0;
	z-index: -2;
	border-radius: inherit;
	box-shadow:
		0 0 0 1px rgba(var(--tyb-ink-rgb, 16, 22, 28), .07),
		0 2px 6px rgba(var(--tyb-ink-rgb, 16, 22, 28), .08),
		0 28px 64px -16px rgba(var(--tyb-ink-rgb, 16, 22, 28), .42);
	pointer-events: none;
}
/* level 2: the card's top edge comes down to its pages (theme.js sets --tyb-menu-drop, phones only) */
.tyb-menu--sheet .tyb-menu__ground i,
.tyb-menu--sheet .tyb-menu__panel::before,
.tyb-menu--sheet .tyb-menu__head {
	transform: translate3d(0, var(--tyb-menu-drop, 0px), 0);
	transition: transform .3s var(--tyb-menu-push);
}
/* -------------------------------------------------------------- the head -- */

.tyb-menu--sheet .tyb-menu__head {
	min-height: 60px;
	padding: 20px 64px 2px var(--tyb-menu-pad);
	touch-action: none;
	-webkit-user-select: none;
	user-select: none;
}
.tyb-menu--sheet .tyb-menu__handle {
	display: block;
	position: absolute;
	top: 7px;
	left: 50%;
	width: 36px;
	height: 5px;
	margin-left: -18px;
	border-radius: 3px;
	background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .2);
}
.tyb-menu--sheet .tyb-menu__who { gap: 10px; }
.tyb-menu--sheet .tyb-menu__face { width: 24px; height: 24px; box-shadow: 0 0 0 1px rgba(var(--tyb-ink-rgb, 16, 22, 28), .08); }
/* the name in the site's serif, like the masthead's wordmark; the firm under it in small capitals */
.tyb-menu--sheet .tyb-menu__name { font-family: var(--tyb-display); font-size: 17px; font-weight: 400; line-height: 1.15; letter-spacing: 0; }
.tyb-menu--sheet .tyb-menu__firm { margin-top: 2px; font-size: 10.5px; font-weight: 500; line-height: 1.3; letter-spacing: .12em; text-transform: uppercase; }
.tyb-menu--sheet .tyb-menu__lang { position: absolute; right: 60px; top: 50%; margin: -12px 0 0; }

/* The X: a 44px target around a 30px disc, two short bars crossed. */
.tyb-menu--sheet .tyb-menu__close {
	position: absolute;
	top: 50%;
	right: calc(var(--tyb-menu-pad) - 7px);
	margin-top: -13px;
	border-radius: 50%;
}
.tyb-menu--sheet .tyb-menu__bars {
	position: relative;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background: var(--tyb-menu-plate);
	transition: transform .12s ease-out;
}
.tyb-menu--sheet .tyb-menu__bars i,
.tyb-menu--sheet .tyb-menu__bars i + i { position: absolute; left: 9.5px; top: 14.25px; width: 11px; margin: 0; opacity: .78; transition: none; }
.tyb-menu--sheet .tyb-menu__bars i:nth-child(1) { transform: rotate(45deg) !important; }
.tyb-menu--sheet .tyb-menu__bars i:nth-child(2) { display: none; }
.tyb-menu--sheet .tyb-menu__bars i:nth-child(3) { transform: rotate(-45deg) !important; }
.tyb-menu--sheet .tyb-menu__close.is-pressed .tyb-menu__bars { transform: scale(.9); }
.tyb-menu--sheet .tyb-menu__close:focus-visible { outline-offset: -6px; }

/* -------------------------------------------------------------- the list -- */

.tyb-menu--sheet .tyb-menu__nav { flex: 0 1 auto; }
.tyb-menu--sheet .tyb-menu__list { flex: 0 1 auto; }
/* more rows than the screen holds: the list scrolls inside the card and its last 28px fade */
.tyb-menu--sheet.is-more .tyb-menu__list,
.tyb-menu--sheet .tyb-menu__sub.is-more {
	-webkit-mask-image: linear-gradient(#000 calc(100% - 28px), transparent);
	mask-image: linear-gradient(#000 calc(100% - 28px), transparent);
}

.tyb-menu--sheet .tyb-menu__link,
.tyb-menu--sheet .tyb-menu__sublink,
.tyb-menu--sheet .tyb-menu__back {
	gap: 12px;
	width: 100%;
	min-height: var(--tyb-menu-row);
	padding: 8px var(--tyb-menu-pad);
	font-size: 19px;
	font-weight: 450;
	line-height: 1.2;
	letter-spacing: -.015em;
	text-transform: none;
	z-index: 0;      /* its own layer, so the pressed plate (z-index -1) sits under the words */
}
.tyb-menu--sheet .tyb-menu__label { flex: 1 1 auto; overflow-wrap: anywhere; }
/* a chevron pointing on: 3.4:1 on the ground, it is a control's sign */
.tyb-menu--sheet .tyb-menu__more { width: 14px; height: 14px; opacity: .5; transform: rotate(-90deg); }

/* the hairline belongs to the row, so it arrives with it */
.tyb-menu--sheet .tyb-menu__item + .tyb-menu__item > .tyb-menu__link::before,
.tyb-menu--sheet .tyb-menu__sublink::before {
	content: '';
	position: absolute;
	top: 0;
	left: var(--tyb-menu-pad);
	right: var(--tyb-menu-pad);
	height: 1px;
	background: var(--tyb-menu-hair);
}

/* a pressed row: a soft inset plate, painted on the next frame (theme.js sets .is-pressed) */
.tyb-menu--sheet .tyb-menu__link::after,
.tyb-menu--sheet .tyb-menu__sublink::after,
.tyb-menu--sheet .tyb-menu__back::after {
	content: '';
	position: absolute;
	inset: 3px 8px;
	z-index: -1;
	border-radius: 12px;
	background: var(--tyb-menu-plate);
	opacity: 0;
	transition: opacity .2s linear;
	pointer-events: none;
}
.tyb-menu--sheet .is-pressed::after { opacity: 1; transition-duration: 0s; }
.tyb-menu--sheet .tyb-menu__link:focus-visible,
.tyb-menu--sheet .tyb-menu__sublink:focus-visible,
.tyb-menu--sheet .tyb-menu__back:focus-visible { outline-offset: -4px; border-radius: 12px; }

/* the page you are on: heavier, with a short accent tab at the card's edge */
.tyb-menu--sheet .tyb-menu__item.is-current > .tyb-menu__link,
.tyb-menu--sheet .tyb-menu__item.has-current > .tyb-menu__link,
.tyb-menu--sheet .tyb-menu__sublink[aria-current] { font-weight: 600; }
.tyb-menu--sheet .tyb-menu__sublink[aria-current],
.tyb-menu--sheet .tyb-menu__sublink[aria-current]:hover { color: var(--tyb-menu-ink); }
.tyb-menu--sheet .tyb-menu__item.is-current > .tyb-menu__link > .tyb-menu__label::after,
.tyb-menu--sheet .tyb-menu__item.has-current > .tyb-menu__link > .tyb-menu__label::after,
.tyb-menu--sheet.is-push .tyb-menu__sublink[aria-current] > span::after {
	content: '';
	position: absolute;
	left: 0;
	top: 50%;
	width: 3px;
	height: 20px;
	margin-top: -10px;
	border-radius: 0 2px 2px 0;
	background: var(--tyb-menu-accent);
}

/* The card rises first; then the rows arrive one after another, each rising
   14px, 45ms apart, clearly in turn. On the way out nothing staggers. */
.tyb-menu--sheet.is-js .tyb-menu__item > .tyb-menu__link {
	opacity: 0;
	transform: translate3d(0, 14px, 0);
	transition: opacity 0s linear .26s, transform 0s linear .26s;
}
.tyb-menu--sheet.is-open .tyb-menu__item > .tyb-menu__link {
	opacity: 1;
	transform: translate3d(0, 0, 0);
	transition: opacity .18s linear, transform .34s var(--tyb-menu-push);
	transition-delay: calc(140ms + var(--i, 0) * 45ms);
}

/* --------------------------------------------------------------- level 2 -- */

/* JavaScript off: a section's pages sit under it, indented, and need no back row */
.tyb-menu--sheet:not(.is-js) .tyb-menu__sub { padding: 0 0 6px; }
.tyb-menu--sheet:not(.is-js) .tyb-menu__sublink { min-height: 44px; padding-left: calc(var(--tyb-menu-pad) + 18px); font-size: 16px; font-weight: 400; }
.tyb-menu--sheet:not(.is-js) .tyb-menu__sublink::before { display: none; }

/* With script the panels are lifted out of their rows (theme.js) and laid over
   the list, off to the right, resting on the dock. */
.tyb-menu--sheet.is-push .tyb-menu__sub {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	max-height: 100%;
	overflow-x: hidden;
	overflow-y: auto;
	overscroll-behavior: contain;
	scrollbar-width: none;
	visibility: hidden;
	opacity: 0;
	transform: translate3d(100%, 0, 0);
	transition: transform .24s var(--tyb-menu-in), opacity .12s linear, visibility 0s linear .24s;
}
.tyb-menu--sheet.is-push .tyb-menu__sub.is-on {
	visibility: visible;
	opacity: 1;
	transform: translate3d(0, 0, 0);
	transition: transform .3s var(--tyb-menu-push), opacity .16s linear .05s, visibility 0s linear 0s;
}
.tyb-menu--sheet.is-push .tyb-menu__list { transition: transform .3s var(--tyb-menu-push), opacity .18s linear .06s, visibility 0s linear 0s; }
.tyb-menu--sheet.is-push .tyb-menu__nav.is-sub .tyb-menu__list {
	visibility: hidden;
	opacity: 0;
	transform: translate3d(-24%, 0, 0);
	transition: transform .3s var(--tyb-menu-push), opacity .08s linear, visibility 0s linear .3s;
}

.tyb-menu--sheet.is-push .tyb-menu__back { display: flex; font-weight: 600; }
.tyb-menu--sheet .tyb-menu__back svg { flex: none; display: block; opacity: .6; }
/* under the section's name, past the back chevron */
.tyb-menu--sheet.is-push .tyb-menu__sublink { padding-left: calc(var(--tyb-menu-pad) + 20px); font-weight: 400; }
.tyb-menu--sheet.is-push .tyb-menu__sublink[aria-current] { font-weight: 600; }
.tyb-menu--sheet.is-push .tyb-menu__sublink::before { left: calc(var(--tyb-menu-pad) + 20px); }

/* its pages follow the panel in, 45ms apart (and are reset once it has left) */
.tyb-menu--sheet.is-push .tyb-menu__sublink {
	opacity: 0;
	transform: translate3d(14px, 0, 0);
	transition: opacity 0s linear .24s, transform 0s linear .24s;
}
.tyb-menu--sheet.is-push .tyb-menu__sub.is-on .tyb-menu__sublink {
	opacity: 1;
	transform: translate3d(0, 0, 0);
	transition: opacity .18s linear, transform .3s var(--tyb-menu-push);
	transition-delay: calc(80ms + var(--j, 0) * 45ms);
}

/* --------------------------------------------------------------- the dock -- */

.tyb-menu--sheet .tyb-menu__foot {
	display: grid;
	grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
	gap: 8px;
	padding: 10px var(--tyb-menu-pad) var(--tyb-menu-pad);
}
.tyb-menu--sheet .tyb-menu__foot > :only-child { grid-column: 1 / -1; }
/* head first, rows next, the two actions last */
.tyb-menu--sheet.is-js .tyb-menu__foot { opacity: 0; transition: opacity 0s linear .26s; }
.tyb-menu--sheet.is-open .tyb-menu__foot { opacity: 1; transition: opacity .2s linear .12s; }

.tyb-menu--sheet .tyb-menu__call,
.tyb-menu--sheet .tyb-menu__value {
	padding: 6px 10px;
	border-radius: 10px;      /* near the site's 8px buttons: a brokerage's card, not an app's */
	font-size: 16px;
	font-weight: 600;
	line-height: 1.15;
	letter-spacing: -.008em;
	transition: transform .12s ease-out, opacity .12s linear;
}
.tyb-menu--sheet .tyb-menu__num { display: none; }
.tyb-menu--sheet .tyb-menu__call,
.tyb-menu--sheet .tyb-menu__call:hover { background: var(--tyb-menu-plate); color: var(--tyb-menu-ink); font-weight: 500; }      /* the filled button is the only heavy one */
.tyb-menu--sheet .tyb-menu__value,
.tyb-menu--sheet .tyb-menu__value:hover { background: var(--tyb-menu-accent); color: #fff; }
.tyb-menu--sheet .tyb-menu__call.is-pressed,
.tyb-menu--sheet .tyb-menu__value.is-pressed { transform: scale(.97); opacity: .86; }
.tyb-menu--sheet .tyb-menu__call:focus-visible,
.tyb-menu--sheet .tyb-menu__value:focus-visible { outline-offset: 2px; }

/* ------------------------------------------------ the burger, on a phone -- */

/* Round 9 review: the card has its own X, so the burger above it must not turn
   into a second one over the dimmed page. On a phone it keeps its three bars
   and steps out while the card is up (theme.js puts .tyb-menu-on--sheet on
   <html>); a tap where it was lands on the dimmed page, which closes. From
   600px the burger IS the X and the card's own is for the keyboard (below). */
@media (max-width: 599px) {
	html.tyb-menu-on--sheet .tyb-burger { opacity: 0; pointer-events: none; }
	html.tyb-menu-on--sheet .tyb-burger__box i:nth-child(n) { opacity: 1; transform: none; }
}
@media (max-width: 599px) and (prefers-reduced-motion: no-preference) {
	.tyb-burger { transition: background .25s var(--tyb-ease), border-color .25s var(--tyb-ease), transform .18s var(--tyb-ease), opacity .16s linear; }
}

/* ------------------------------------------------------------------ sizes -- */

/* a short screen (an older iPhone with the browser bars showing): a tighter head; rows stay 52px */
@media (max-height: 600px) and (max-width: 599px) {
	.tyb-menu--sheet { --tyb-menu-row: 52px; }
	.tyb-menu--sheet .tyb-menu__head { min-height: 52px; padding-top: 18px; padding-bottom: 2px; }
	.tyb-menu--sheet .tyb-menu__panel { max-height: calc(100% - 40px - env(safe-area-inset-bottom, 0px)); }
	.tyb-menu--sheet .tyb-menu__foot { padding-top: 8px; padding-bottom: 14px; }
}

/* 600px and up: the same card under the burger (theme.js measures the burger) */
@media (min-width: 600px) {
	.tyb-menu--sheet .tyb-menu__panel {
		left: auto;
		bottom: auto;
		top: var(--tyb-menu-top, 76px);
		right: var(--tyb-menu-x-right, 16px);
		width: 400px;
		max-height: calc(100% - var(--tyb-menu-top, 76px) - 12px);
		border-radius: 22px;
		transform-origin: 100% 0;
	}
	.tyb-menu--sheet.is-js .tyb-menu__panel { transform: scale(.96); opacity: 0; transition: transform .16s var(--tyb-menu-in), opacity .16s linear; }
	.tyb-menu--sheet.is-open .tyb-menu__panel { transform: scale(1); opacity: 1; transition: transform .22s var(--tyb-menu-out), opacity .14s linear; }
	/* the card hangs by its top edge here, so a second level starts at the top and the card keeps its height */
	.tyb-menu--sheet.is-push .tyb-menu__sub { top: 0; bottom: auto; }
	.tyb-menu--sheet .tyb-menu__handle { display: none; }
	.tyb-menu--sheet .tyb-menu__head { min-height: 56px; padding-top: 8px; padding-bottom: 4px; touch-action: auto; }
	.tyb-menu--sheet .tyb-menu__close { margin-top: -22px; }
	/* the burger above has become an X, and a tap on it closes: the card's own X is for the keyboard */
	.tyb-menu--sheet.is-js .tyb-menu__close:not(:focus-visible) { opacity: 0; pointer-events: none; }
	.tyb-menu--sheet.is-js .tyb-menu__head { padding-right: var(--tyb-menu-pad); }
}
/* a phone on its side: too short for one column, so the card starts at the top
   edge, widens, and the list runs in two columns */
@media (min-width: 600px) and (max-height: 480px) {
	.tyb-menu--sheet .tyb-menu__panel { top: 8px; width: min(560px, calc(100% - 24px)); max-height: calc(100% - 16px); }
	.tyb-menu--sheet .tyb-menu__list { column-count: 2; column-gap: 0; }
	.tyb-menu--sheet .tyb-menu__item { break-inside: avoid; }
	.tyb-menu--sheet .tyb-menu__item:first-child > .tyb-menu__link::before {
		content: '';
		position: absolute;
		top: 0;
		left: var(--tyb-menu-pad);
		right: var(--tyb-menu-pad);
		height: 1px;
		background: var(--tyb-menu-hair);
	}
	.tyb-menu--sheet.is-js .tyb-menu__close:not(:focus-visible) { opacity: 1; pointer-events: auto; }
	.tyb-menu--sheet.is-js .tyb-menu__head { padding-right: 64px; }
}

@media (prefers-reduced-motion: reduce) {
	.tyb-menu--sheet.is-js .tyb-menu__panel,
	.tyb-menu--sheet.is-js .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--sheet.is-push .tyb-menu__sub,
	.tyb-menu--sheet.is-push .tyb-menu__sublink,
	.tyb-menu--sheet.is-push .tyb-menu__nav.is-sub .tyb-menu__list,
	.tyb-menu--sheet .is-pressed { transform: none; }
}
@media (prefers-reduced-motion: reduce) and (min-width: 600px) {
	.tyb-menu--sheet.is-js .tyb-menu__panel { opacity: 1; }
}
/* ═══════ end ROUND 9 2026-10-05 — the phone menu, style "sheet" ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — buttons: two looks, sitewide (Q9-03, Q9-17)
   Six button styles were live at once: the old serif small-caps button with
   4px corners sat beside the new sans buttons with 5px, 8px, 12px and pill
   corners, and "View all" had two looks.

   Now there are two, and every button on the site is one of them:

     THE ACTION    a filled button in the palette's button color, 8px corners,
                   sans 600 capitals. One per section at most.
                   (.tyb-btn--accent, the hero's bar, the page action, the
                   form's send button, the listing ask box, About's call.)
     THE LINK      an ink outline pill, sans 600, sentence case. Everything
                   else. (.tyb-btn, --ghost, "View all", "Read all reviews",
                   "More about <name>", the questions' ask button.)

   48px tall at least (44px for --sm). No serif, no 4px corners anywhere.
   A build never restyles a button: it picks one of the two classes.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-btn {
	min-height: 48px;
	padding: 0 1.5rem;
	border: 1px solid var(--tyb-ink);
	border-radius: 999px;
	background: transparent;
	box-shadow: none;
	color: var(--tyb-ink);
	font-family: var(--tyb-body-font);
	font-size: .9375rem;
	font-weight: 600;
	line-height: 1.2;
	letter-spacing: 0;
	text-transform: none;
	text-align: center;
}
.tyb-btn:hover { background: var(--tyb-ink); border-color: var(--tyb-ink); color: #fff; transform: none; box-shadow: none; }
.tyb-btn:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }
.tyb-btn .tyb-icon { flex: none; color: currentColor; }

.tyb-btn--sm { min-height: 44px; padding: 0 1.15rem; font-size: .875rem; }
.tyb-btn--lg { min-height: 54px; padding: 0 1.9rem; font-size: 1rem; }

.tyb-btn--ghost,
.tyb-btn--ghost:hover { border-color: var(--tyb-ink); }
.tyb-btn--ghost { background: transparent; color: var(--tyb-ink); }
.tyb-btn--ghost:hover { background: var(--tyb-ink); color: #fff; }

.tyb-btn--ghost-light { background: transparent; border-color: rgba(255, 255, 255, .7); color: #fff; }
.tyb-btn--ghost-light:hover { background: #fff; border-color: #fff; color: var(--tyb-ink); }
.tyb-btn--ghost-light:focus-visible { outline-color: #fff; }

/* The action. */
.tyb-btn--accent,
.tyb-btn--accent:hover {
	border: 0;
	border-radius: 8px;
	color: #fff;
	filter: none;
	box-shadow: none;
}
.tyb-btn--accent {
	min-height: 52px;
	padding: 0 1.6rem;
	background: var(--tyb-coral);
	font-size: .8125rem;
	letter-spacing: .1em;
	text-transform: uppercase;
}
.tyb-btn--accent:hover { background: var(--tyb-coral-dk); }
.tyb-btn--accent.tyb-btn--lg { min-height: 56px; padding: 0 2rem; font-size: .875rem; }
.tyb-btn--accent:focus-visible { outline: 2px solid var(--tyb-deep); outline-offset: 3px; }

/* The filled buttons that have their own class take the same 8px corners. */
.tyb-hero6__go,
.tyb-hero6__go--solo,
.tyb-pact7__go,
.tyb-pop .tyb-form__send,
.tyb-form--inline .tyb-form__send,
.tyb-ask .tyb-ask__go,
.tyb-ab7__btn { border-radius: 8px; }

/* The outline links that have their own class take the same height. */
.tyb-rv__all,
.tyb-pmore__all,
.tyb-faq7__ask { min-height: 48px; }

/* About's second button (email) is a link, so it is the pill. */
.tyb-ab7__btn--mail { border-radius: 999px; }

/* On a photograph or the brand ground the outline pill is white. */
.tyb-creed5--photo .tyb-btn:not(.tyb-btn--accent),
.tyb-spec5--photo .tyb-btn:not(.tyb-btn--accent),
.tyb-banner .tyb-btn:not(.tyb-btn--accent) { border-color: rgba(255, 255, 255, .75); color: #fff; }
.tyb-creed5--photo .tyb-btn:not(.tyb-btn--accent):hover,
.tyb-spec5--photo .tyb-btn:not(.tyb-btn--accent):hover,
.tyb-banner .tyb-btn:not(.tyb-btn--accent):hover { background: #fff; border-color: #fff; color: var(--tyb-ink); }

/* The masthead's button: an outline on the white bar, white over the hero. */
.tyb-header__actions .tyb-btn--sm { min-height: 44px; }
.tyb-home .tyb-header:not(.is-solid) .tyb-header__actions .tyb-btn--sm:hover,
.tyb-mast--dark .tyb-header .tyb-header__actions .tyb-btn--sm:hover { background: #fff; border-color: #fff; color: var(--tyb-ink); }

/* The legal links: "DMCA" was 37px wide. */
.tyb-foot__legalnav a { min-width: 44px; }

@media (prefers-reduced-motion: reduce) {
	.tyb-btn { transition: none; }
}

/* ═══════ end ROUND 9 2026-10-05 — buttons: two looks, sitewide ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the call pill: always open, never on a control (Q9.C, Q9-10)
   Adam: "i liked the old floating call button that had the text on it, i
   think it said call first name ... and one other line below their name i
   think it was maybe their brokerage".

   The pill is the full pill at every width, phones and desktop: the agent's
   face (the phone glyph when there is no face file), "Call <first name>", the
   agent's own number, and one small line with the firm (never an office
   number). Round 5's fold to a round button is gone, and so is the desktop
   rest state that opened on hover.

   It still leaves, by the same fade, in two cases (theme.js, section 2):
     - over the zones that carry their own call or send control: the hero, the
       figures strip, the quote band, an inline form, the lead band, the
       footer, a listing's facts row and ask box, the page action, About's top;
     - while a button, a link's words, a form field, a listing card's text or
       a review's text is under it. That is tested where the pill is, so no
       page has to be listed.
   .is-hidden is opacity only at every width now: the pill no longer slides
   away, so the place the script tests is the place the pill is.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-callbar[data-tyb-callbar] { right: clamp(.75rem, 2vw, 1.5rem); transition: opacity .22s var(--tyb-ease), visibility 0s linear 0s; }
.tyb-callbar[data-tyb-callbar].is-hidden {
	transform: none;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity .22s var(--tyb-ease), visibility 0s linear .22s;
}

.tyb-callbar[data-tyb-callbar] .tyb-callbar__call {
	gap: .7rem;
	padding: .45rem 1.15rem .6rem .5rem;
	clip-path: none;
	transform: none;
	transition: box-shadow .22s var(--tyb-ease);
}
.tyb-callbar[data-tyb-callbar] .tyb-callbar__call::after { opacity: 1; }
.tyb-callbar[data-tyb-callbar] .tyb-callbar__call:hover,
.tyb-callbar[data-tyb-callbar] .tyb-callbar__call:focus-visible { gap: .7rem; padding: .45rem 1.15rem .6rem .5rem; transform: none; }
.tyb-callbar[data-tyb-callbar] .tyb-callbar__call:active { transform: scale(.98); }
.tyb-callbar[data-tyb-callbar] .tyb-callbar__call:focus-visible { outline: 3px solid var(--tyb-brand); outline-offset: 3px; }

.tyb-callbar[data-tyb-callbar] .tyb-callbar__call .tyb-callbar__txt {
	max-width: none;
	height: auto;
	opacity: 1;
	overflow: visible;
	white-space: nowrap;
	line-height: 1.2;
	transition: none;
}
/* "Call <first name>": the line he remembers, in the serif. */
.tyb-callbar[data-tyb-callbar] .tyb-callbar__txt strong {
	position: static;
	width: auto; height: auto;
	margin: 0; padding: 0;
	overflow: visible;
	clip: auto; clip-path: none;
	font-family: var(--tyb-display);
	font-size: 1.0625rem;
	font-weight: 400;
	line-height: 1.1;
	color: var(--tyb-ink);
}
.tyb-callbar[data-tyb-callbar] .tyb-callbar__txt em {
	margin-top: 1px;
	font-size: .875rem;
	font-weight: 600;
	letter-spacing: .01em;
	font-variant-numeric: tabular-nums;
}
.tyb-callbar[data-tyb-callbar] .tyb-callbar__firm.tyb-firmtag {
	margin-top: 2px;
	max-width: 11.5rem;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-size: .6875rem;
	line-height: 1.25;
	color: var(--tyb-muted);
	opacity: 1;
}

@media (max-width: 370px) {
	.tyb-callbar[data-tyb-callbar] .tyb-callbar__firm.tyb-firmtag { max-width: 9.5rem; }
}
@media (prefers-reduced-motion: reduce) {
	.tyb-callbar[data-tyb-callbar],
	.tyb-callbar[data-tyb-callbar].is-hidden,
	.tyb-callbar[data-tyb-callbar] .tyb-callbar__call { transition: none; }
}

/* ═══════ end ROUND 9 2026-10-05 — the call pill: always open, never on a control ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the footer's "Get in touch" (Q9.F, Q9-25, Q9-16)
   Adam: "the footer lines are good now for the mobile footer - but the get in
   touch section there could be better, maybe remove the lines there and add
   icons for a little bit of extra spice on phone address and email."

   The ruled two-column Explore links are untouched. In "Get in touch" the
   hairlines are gone and the phone, the email and the address each start with
   a small FILLED icon in the text's own light ink (no gold, no accent), on
   one left edge, 44px rows. The firm name stays a plain line above. The two
   column labels are the site's sans kicker, at 11px, not the old serif caps.
   ═══════════════════════════════════════════════════════════════════════════ */

.tyb-foot__h {
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .2em;
	color: rgba(255, 255, 255, .62);
}

.tyb-foot__reach { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
.tyb-foot__reach li { margin: 0; padding: 0; border: 0; }
.tyb-foot__reach .tyb-foot__link,
.tyb-foot__reach .tyb-foot__addr {
	display: flex;
	align-items: center;
	gap: .8rem;
	min-height: 44px;
	margin: 0;
	padding: 0;
	border: 0;
	color: rgba(255, 255, 255, .84);
	font-size: .95rem;
	line-height: 1.4;
}
.tyb-foot__reach .tyb-foot__addr { align-items: flex-start; min-height: 0; padding-block: 11px 0; }
.tyb-foot__reach .tyb-icon { flex: none; width: 16px; height: 16px; color: currentColor; opacity: .78; }
.tyb-foot__reach .tyb-foot__addr .tyb-icon { margin-top: 3px; }
.tyb-foot__reach span { min-width: 0; overflow-wrap: anywhere; }
.tyb-foot__reach .tyb-foot__link:hover { color: #fff; }
.tyb-foot__reach .tyb-foot__link:hover .tyb-icon { opacity: 1; }

.tyb-foot .tyb-firmtag { margin-bottom: 4px; }
/* Desktop: the column is wide enough for the address on two lines, not three. */
@media (min-width: 901px) {
	.tyb-foot__col:has(.tyb-foot__reach) { flex: 0 1 270px; }
}
.tyb-foot__social { margin-top: 10px; }

/* ═══════ end ROUND 9 2026-10-05 — the footer's "Get in touch" ═══════ */


/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 9 2026-10-05 — the base pages, locked down (Q9)
   One design on every page. What each group fixes is named at its head; the
   finding numbers are tmp/audit-20261004/round9/qa/QA.md.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Q9-08: the focus ring on dark grounds. It was the deep color on the deep
   color: the utility bar, the masthead over the hero, the dark masthead, the
   banners, the photo bands and the footer. White there. ── */
.tyb-utility a:focus-visible,
.tyb-home .tyb-header:not(.is-solid) a:focus-visible,
.tyb-home .tyb-header:not(.is-solid) button:focus-visible,
.tyb-mast--dark .tyb-header a:focus-visible,
.tyb-mast--dark .tyb-header button:focus-visible,
.tyb-banner a:focus-visible,
.tyb-nums5:not(.tyb-nums5--light) a:focus-visible,
.tyb-creed5--photo a:focus-visible,
.tyb-creed5--photo button:focus-visible,
.tyb-lead5--photo .tyb-lead5__copy a:focus-visible,
.tyb-foot a:focus-visible { outline-color: #fff; }

/* ── Q9-04: the fallback closer (only when lead() returns nothing; every
   other page ends on the lead band). The site's kicker, heading and the two
   buttons, on the warm ground, with no gradient. ── */
.tyb-closer.tyb-closer9 {
	padding-block: clamp(3.5rem, 7vw, 6rem);
	background: var(--tyb-shell);
	border-top: 1px solid var(--tyb-line);
	text-align: center;
}
.tyb-closer9::before { display: none; }
.tyb-closer9 .tyb-kick5 { justify-content: center; margin-bottom: 1rem; }
.tyb-closer9 .tyb-closer__title { max-width: none; margin: 0; color: var(--tyb-ink); }
.tyb-closer9 .tyb-closer__lede { color: var(--tyb-body); }
.tyb-closer9 .tyb-closer__actions { gap: .75rem; }
@media (max-width: 640px) {
	.tyb-closer9 .tyb-closer__actions .tyb-btn { flex: 1 1 100%; }
}

/* ── Q9-09: the 404 page. Two buttons and one line of links. ── */
.tyb-nf9 { padding-block: clamp(2.5rem, 6vw, 4.5rem); background: var(--tyb-shell); }
.tyb-nf9__actions { display: flex; flex-wrap: wrap; gap: .75rem; }
.tyb-nf9__links {
	display: flex;
	flex-wrap: wrap;
	gap: 0 1.9rem;
	margin: 1.75rem 0 0;
	padding: 1rem 0 0;
	border-top: 1px solid var(--tyb-line);
	list-style: none;
}
.tyb-nf9__links a {
	display: inline-flex;
	align-items: center;
	min-width: 44px;
	min-height: 44px;
	font-size: .9375rem;
	font-weight: 600;
	color: var(--tyb-ink);
	text-decoration: underline;
	text-decoration-color: var(--tyb-line);
	text-underline-offset: .3em;
}
.tyb-nf9__links a:hover { text-decoration-color: currentColor; }
@media (max-width: 640px) {
	.tyb-nf9__actions .tyb-btn { flex: 1 1 100%; }
}

/* ── Q9-22, Q9-L1: a banner with no photograph. No photo → the brand ground
   (never a striped box); no photo and no lede (the legal pages) → the short
   banner, so the title does not take half a phone screen. ── */
.tyb-banner--nophoto { background: var(--tyb-deep); }
.tyb-banner--plain { min-height: 0; padding-block: clamp(2.5rem, 6vh, 3.75rem) clamp(1.5rem, 4vh, 2.25rem); }
.tyb-banner__media .tyb-figure--cover img { width: 100%; height: 100%; object-fit: cover; }
.tyb-banner__media picture { display: block; width: 100%; height: 100%; }

/* ── Q9-06: For Sellers and For Buyers at 390x664. The page's one action was
   cut by the fold (the button ended at 733px and 692px). On a phone the
   banner and the action card are tighter, by spacing alone. ── */
@media (max-width: 640px) {
	.tyb-banner:has(+ .tyb-pg7) { min-height: 0; padding-top: 2rem; padding-bottom: calc(1.25rem + 2.75rem); }
	.tyb-banner:has(+ .tyb-pg7) .tyb-banner__title { font-size: clamp(1.9rem, 1.2rem + 3.4vw, 2.3rem); line-height: 1.06; }
	.tyb-banner:has(+ .tyb-pg7) .tyb-banner__lede { margin-top: .7rem; font-size: .9375rem; line-height: 1.5; }
	.tyb-pg7 .tyb-pact7__card { gap: 1rem; padding: 1.5rem 1.15rem 1.25rem; }
	.tyb-pg7 .tyb-pact7__copy .tyb-kick5 { margin-bottom: .55rem; }
	.tyb-pg7 .tyb-pact7__title { font-size: 1.75rem; }
	.tyb-pg7 .tyb-pact7__text { margin-top: .5rem; font-size: .9375rem; line-height: 1.45; }
	.tyb-pg7 .tyb-pact7__go { min-height: 56px; padding-inline: 1.15rem; gap: .75rem; font-size: .8125rem; letter-spacing: .06em; }
}

/* ── Q9-11: one property card. The archive's cards wear the row card's skin
   (archive-properties.php adds .tyb-list5 to the grid): the photograph is
   the card, no border, the white tag, tracked capitals. In a grid the price
   sits over the street at every width, as the row card does on a phone. ── */
.tyb-cards.tyb-list5 { padding-block: 0; overflow: visible; }
.tyb-arch .tyb-cards { gap: clamp(2.25rem, 3.2vw, 3rem) clamp(1.25rem, 2.4vw, 2.25rem); }
.tyb-arch .tyb-card__body { grid-template-columns: minmax(0, 1fr) auto; column-gap: .75rem; row-gap: .3rem; padding-top: 1rem; }
.tyb-arch .tyb-card__price { grid-column: 1 / -1; grid-row: 1; font-size: 1.5rem; }
.tyb-arch .tyb-card__title { grid-column: 1 / -1; grid-row: 2; font-size: 1.3rem; }
.tyb-arch .tyb-card__addr { grid-column: 1; grid-row: 3; margin-top: .2rem; }
.tyb-arch .tyb-card__repd { grid-column: 2; grid-row: 3; align-self: end; margin: 0; white-space: nowrap; }
.tyb-arch .tyb-card__specs { grid-column: 1 / -1; grid-row: 4; justify-content: flex-start; }
.tyb-arch .tyb-empty { background: none; border: 0; }
/* Q9-L3: the empty archive (reached only by its address now) in the site's heading. */
.tyb-empty h2 { font-size: clamp(1.75rem, 1.3rem + 1.6vw, 2.4rem); line-height: 1.08; letter-spacing: -.02em; }

/* ── Q9-16: nothing under 11px. ── */
.tyb-card__status { font-size: .6875rem; }
.tyb-card__repd { font-size: .6875rem; }

/* ── Q9-12: Contact and Home valuation in the site's language. The form
   heading is the kicker and the large heading (in the templates); the aside
   labels are the sans kicker at 11px in the brand color, and the phone and
   email are 44px links. ── */
.tyb-contact__form .tyb-kick5 { margin-bottom: 1rem; }
.tyb-contact__title { max-width: 18ch; margin: 0; }
.tyb-contact__form .tyb-form__lede { margin-top: .9rem; }
.tyb-contact__heading {
	margin-bottom: .35rem;
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .2em;
	color: var(--tyb-brand);
}
.tyb-contact__big {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	font-family: var(--tyb-body-font);
	font-size: 1.0625rem;
	font-weight: 600;
	font-variant-numeric: tabular-nums;
}
.tyb-contact__block .tyb-firmtag { margin: 0; }
.tyb-contact__seal p { font-family: var(--tyb-body-font); font-size: .8125rem; letter-spacing: .02em; }
@media (max-width: 640px) {
	.tyb-contact__heading { font-size: .6875rem; }
	.tyb-contact__title { max-width: none; }
}

/* ── Q9-L1: the home "Meet" section with no headshot file. No media column:
   the name, the role, the bio and the button on one measure at the left edge. ── */
.tyb-meet5.tyb-meet5--nophoto .tyb-split { grid-template-columns: minmax(0, 1fr); }
.tyb-meet5--nophoto .tyb-split__body { max-width: 46rem; }

/* ── Q9-L4: a listings row that cannot move shows no arrows (theme.js adds
   .is-still), and a row of ONE card is a single card at the left, not a
   card stretched across the page. ── */
.tyb-slider.is-still .tyb-slider__btn { display: none; }
@media (min-width: 900px) {
	.tyb-list5 .tyb-slider--one .tyb-slider__track { grid-auto-columns: minmax(0, 34rem); }
}

/* ── Q9-18: 360px. The role and firm line balances its two lines, and a
   two-word town does not take a second line on the tile. ── */
.tyb-meet5__firm,
.tyb-ab7__role { text-wrap: balance; }
@media (max-width: 370px) {
	.tyb-tile5--town .tyb-tile5__name { font-size: 1.15rem; letter-spacing: -.01em; }
}

/* ── Q9-21: the one review on For Sellers and For Buyers. Its heading is a
   label ("From a seller."), so it takes the label's size, not the total's. ── */
.tyb-rv--one .tyb-rv__plain { max-width: none; }

/* ── Round 9 review. "Represented the seller" on a sold card was the last
   serif small-cap label in the accent color; it is the card's own meta now. ── */
.tyb-card .tyb-card__repd {
	font-family: var(--tyb-body-font);
	font-size: .6875rem;
	font-weight: 600;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--tyb-muted);
}

/* ── Round 9 review. The Buyers page's one button: its label and arrow are
   centered, as on every other filled button. ── */
.tyb-pact7__go,
.tyb-pg7 .tyb-pact7__go { justify-content: center; gap: .75rem; text-align: center; }

/* ── Round 9 review. The listing ask box's phone link is THE LINK: the ink
   outline pill (it was a hairline pill, a third look). ── */
.tyb-ask__call { border-color: var(--tyb-ink); background: transparent; }
@media (hover: hover) { .tyb-ask__call:hover { background: var(--tyb-ink); border-color: var(--tyb-ink); color: #fff; } .tyb-ask__call:hover .tyb-icon { color: currentColor; } }

/* ═══════ end ROUND 9 2026-10-05 — the base pages, locked down ═══════ */


/* ══════════════════════════════════════════════════════════════════════════
   ROUND 10 2026-10-05 — the phone menu, style "paper": the default, no lines
   Adam: "the best one or default should be the paper. but it still can be
   improved… no divider lines". The rules between rows, the rule under the
   head and the rule beside an open section are gone; the rows sit a little
   closer and arrive a little sooner. A build appends after this block.
   ══════════════════════════════════════════════════════════════════════════ */
.tyb-menu--paper .tyb-menu__head { border-bottom: 0; }
.tyb-menu--paper .tyb-menu__item { border-bottom: 0; }
.tyb-menu--paper .tyb-menu__rule { display: none; }
.tyb-menu--paper .tyb-menu__list { padding-top: 6px; }
.tyb-menu--paper .tyb-menu__sub { margin-left: calc(var(--tyb-menu-pad) + 2px); padding-bottom: 8px; }
.tyb-menu--paper .tyb-menu__sublink { min-height: 46px; }
.tyb-menu--paper.is-open .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper.is-open .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper.is-open .tyb-menu__foot > * {
	transition: opacity .22s linear, transform .36s var(--tyb-menu-out);
	transition-delay: calc(90ms + var(--i, 0) * 42ms);
}
.tyb-menu--paper.is-open .tyb-menu__link::after { transition-delay: calc(170ms + var(--i, 0) * 42ms); }
@media (min-height: 800px) {
	.tyb-menu--paper { --tyb-menu-row: 66px; }
	.tyb-menu--paper .tyb-menu__list { padding-top: 14px; }
}
@media (prefers-reduced-motion: reduce) {
	.tyb-menu--paper.is-open .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper.is-open .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper.is-open .tyb-menu__foot > * { transition-delay: 0s; }
}
/* ═══════ end ROUND 10 2026-10-05 — the phone menu, style "paper" ═══════ */


/* ══════════════════════════════════════════════════════════════════════════
   ROUND 10 2026-10-05 — the phone menu: three more styles built on paper
   Adam: "make 3 more based off the paper one but with different fonts and
   styles… no divider lines, different good animations."
   Each is Paper underneath (the root carries .tyb-menu--paper as well, and
   theme.js treats it as paper), so the panel, the swipe, the focus trap and
   the fit rules are Paper's. A block here changes the type, the mark on the
   page you are on, the sign on a section, its pages, and how the rows
   arrive. Only opacity, transform and clip-path move. Fonts: the three faces
   the theme already ships. A build picks one with profile()['menu'].
   ══════════════════════════════════════════════════════════════════════════ */

/* ───────────────────────────── "paper-serif": the quiet one ─────────────
   Large serif names with air, the page you are on in the italic with a short
   line drawn in from the panel's edge, a thin chevron right after a
   section's name, its pages in small tracked capitals. Rows rise and fade,
   one after another. */
.tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-pad: 32px; --tyb-menu-size: 35px; }
.tyb-menu--paper-serif .tyb-menu__scrim { background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .5); }
.tyb-menu--paper-serif .tyb-menu__link { justify-content: flex-start; }
.tyb-menu--paper-serif .tyb-menu__label { font-size: var(--tyb-menu-size); line-height: 1.04; letter-spacing: -.012em; }
.tyb-menu--paper-serif .tyb-menu__item.is-current > .tyb-menu__link .tyb-menu__label,
.tyb-menu--paper-serif .tyb-menu__item.has-current > .tyb-menu__link .tyb-menu__label { font-style: italic; }
.tyb-menu--paper-serif .tyb-menu__item.is-current > .tyb-menu__link::after,
.tyb-menu--paper-serif .tyb-menu__item.has-current > .tyb-menu__link::after {
	width: 20px;
	height: 2px;
	margin-top: -1px;
	transform-origin: 0 50%;
}
.tyb-menu--paper-serif.is-js .tyb-menu__link::after { opacity: 1; transform: scaleX(0); transition: transform 0s linear .28s; }
.tyb-menu--paper-serif.is-open .tyb-menu__link::after { opacity: 1; transform: none; transition: transform .5s var(--tyb-menu-out); transition-delay: calc(260ms + var(--i, 0) * 40ms); }
.tyb-menu--paper-serif .tyb-menu__more { width: 14px; height: 14px; margin-left: 12px; margin-top: 6px; color: var(--tyb-menu-soft); transition: transform .32s var(--tyb-menu-out); }
.tyb-menu--paper-serif .tyb-menu__pm { display: none; }
.tyb-menu--paper-serif .tyb-menu__chev { display: block; width: 12px; height: 7px; stroke-width: 1.2; }
.tyb-menu--paper-serif .tyb-menu__link[aria-expanded="true"] .tyb-menu__more { transform: scaleY(-1); }
.tyb-menu--paper-serif .tyb-menu__link::before { display: none; }
.tyb-menu--paper-serif .tyb-menu__link.is-pressed .tyb-menu__label { opacity: .5; }
.tyb-menu--paper-serif .tyb-menu__sub { margin-left: var(--tyb-menu-pad); margin-top: -4px; padding-bottom: 14px; }
.tyb-menu--paper-serif .tyb-menu__sub.is-leaving { left: var(--tyb-menu-pad); }
.tyb-menu--paper-serif .tyb-menu__sublink {
	min-height: 44px;
	padding: 4px var(--tyb-menu-pad) 4px 0;
	font-size: 12px;
	line-height: 1.3;
	font-weight: 500;
	letter-spacing: .16em;
	text-transform: uppercase;
}
.tyb-menu--paper-serif .tyb-menu__sublink.is-pressed { background: none; opacity: .5; }
/* rise and fade, 40ms apart */
.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper-serif.is-js .tyb-menu__foot > * { transform: translate3d(0, 18px, 0); }
.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper-serif.is-open .tyb-menu__foot > * {
	transform: none;
	transition: opacity .3s linear, transform .52s cubic-bezier(.16, 1, .3, 1);
	transition-delay: calc(70ms + var(--i, 0) * 40ms);
}
.tyb-menu--paper-serif.is-open .tyb-menu__foot > * { transition-delay: 220ms; }
.tyb-menu--paper-serif.is-open .tyb-menu__foot > .tyb-menu__value { transition-delay: 260ms; }
.tyb-menu--paper-serif .tyb-menu__value,
.tyb-menu--paper-serif .tyb-menu__value:hover { border-radius: 2px; font-size: 12px; letter-spacing: .16em; }
@media (max-height: 660px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-size: 31px; } }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-size: 42px; --tyb-menu-row: 72px; } .tyb-menu--paper-serif .tyb-menu__list { padding-top: 26px; } .tyb-menu--paper-serif .tyb-menu__sublink { font-size: 12.5px; min-height: 48px; } }
.tyb-menu--paper.tyb-menu--paper-serif.tyb-menu--many { --tyb-menu-size: 31px; }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-serif.tyb-menu--many { --tyb-menu-size: 36px; --tyb-menu-row: 62px; } }
@media (max-width: 374px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-pad: 26px; } }

/* ───────────────────────────── "paper-sans": the modern one ─────────────
   The theme's sans, large and tight. Every page in the softer ink at regular
   weight; the page you are on is the one heavy line, with a small dot after
   it. A chevron on a section, its pages indented and lighter. Rows slide in
   from the right, one after another. Two even buttons at the bottom. */
.tyb-menu--paper.tyb-menu--paper-sans { --tyb-menu-size: 30px; }
.tyb-menu--paper-sans .tyb-menu__label {
	font-family: var(--tyb-body-font);
	font-size: var(--tyb-menu-size);
	line-height: 1.1;
	font-weight: 400;
	letter-spacing: -.035em;
	color: var(--tyb-menu-quiet);
}
.tyb-menu--paper-sans .tyb-menu__item.is-current > .tyb-menu__link .tyb-menu__label,
.tyb-menu--paper-sans .tyb-menu__item.has-current > .tyb-menu__link .tyb-menu__label { font-weight: 600; color: var(--tyb-menu-ink); }
.tyb-menu--paper-sans .tyb-menu__link[aria-expanded="true"] .tyb-menu__label { color: var(--tyb-menu-ink); }
/* the dot after the page you are on (the bar at the edge is not used) */
.tyb-menu--paper-sans .tyb-menu__item.is-current > .tyb-menu__link::after,
.tyb-menu--paper-sans .tyb-menu__item.has-current > .tyb-menu__link::after { display: none; }
.tyb-menu--paper-sans .tyb-menu__item.is-current > .tyb-menu__link .tyb-menu__label::after,
.tyb-menu--paper-sans .tyb-menu__item.has-current > .tyb-menu__link .tyb-menu__label::after {
	content: '';
	display: inline-block;
	width: 7px;
	height: 7px;
	margin-left: 10px;
	border-radius: 50%;
	background: var(--tyb-menu-accent);
	vertical-align: .14em;
}
.tyb-menu--paper-sans .tyb-menu__more { width: 16px; height: 16px; color: var(--tyb-menu-soft); transition: transform .34s var(--tyb-menu-out); }
.tyb-menu--paper-sans .tyb-menu__pm { display: none; }
.tyb-menu--paper-sans .tyb-menu__chev { display: block; }
.tyb-menu--paper-sans .tyb-menu__link[aria-expanded="true"] .tyb-menu__more { transform: rotate(180deg); }
.tyb-menu--paper-sans .tyb-menu__link::before { display: none; }
.tyb-menu--paper-sans .tyb-menu__label { transition: transform .22s var(--tyb-menu-out); }
.tyb-menu--paper-sans .tyb-menu__link.is-pressed .tyb-menu__label { transform: translate3d(6px, 0, 0); transition-duration: .12s; }
.tyb-menu--paper-sans .tyb-menu__sub { margin-left: calc(var(--tyb-menu-pad) + 18px); padding-bottom: 10px; }
.tyb-menu--paper-sans .tyb-menu__sub.is-leaving { left: calc(var(--tyb-menu-pad) + 18px); }
.tyb-menu--paper-sans .tyb-menu__sublink { min-height: 44px; padding: 4px var(--tyb-menu-pad) 4px 0; font-size: 18px; line-height: 1.2; font-weight: 400; letter-spacing: -.015em; }
.tyb-menu--paper-sans .tyb-menu__sublink.is-pressed { background: none; opacity: .55; }
/* from the right, 32ms apart */
.tyb-menu--paper-sans.is-js .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper-sans.is-js .tyb-menu__item > .tyb-menu__sub { transform: translate3d(44px, 0, 0); }
.tyb-menu--paper-sans.is-js .tyb-menu__foot > * { transform: translate3d(22px, 0, 0); }
.tyb-menu--paper-sans.is-open .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper-sans.is-open .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper-sans.is-open .tyb-menu__foot > * {
	transform: none;
	transition: opacity .2s linear, transform .4s cubic-bezier(.2, .8, .2, 1);
	transition-delay: calc(60ms + var(--i, 0) * 32ms);
}
.tyb-menu--paper-sans.is-open .tyb-menu__foot > *,
.tyb-menu--paper-sans.is-open .tyb-menu__foot > .tyb-menu__value { transition-delay: 180ms; }
/* two even buttons */
.tyb-menu--paper-sans .tyb-menu__foot { gap: 8px; }
.tyb-menu--paper-sans .tyb-menu__call,
.tyb-menu--paper-sans .tyb-menu__call:hover {
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-height: 50px;
	padding: 0 16px;
	border-radius: 4px;
	background: rgba(var(--tyb-ink-rgb, 16, 22, 28), .06);
}
.tyb-menu--paper-sans .tyb-menu__calllabel { font-size: 16px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--tyb-menu-ink); }
.tyb-menu--paper-sans .tyb-menu__num { font-family: var(--tyb-body-font); font-size: 16px; font-weight: 400; letter-spacing: 0; }
.tyb-menu--paper-sans .tyb-menu__value,
.tyb-menu--paper-sans .tyb-menu__value:hover { min-height: 50px; font-size: 16px; font-weight: 600; letter-spacing: 0; text-transform: none; }
@media (max-height: 660px) { .tyb-menu--paper.tyb-menu--paper-sans { --tyb-menu-size: 27px; } .tyb-menu--paper-sans .tyb-menu__call, .tyb-menu--paper-sans .tyb-menu__value { min-height: 46px; } }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-sans { --tyb-menu-size: 36px; } .tyb-menu--paper-sans .tyb-menu__sublink { font-size: 19px; min-height: 46px; } }
.tyb-menu--paper.tyb-menu--paper-sans.tyb-menu--many { --tyb-menu-size: 27px; }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-sans.tyb-menu--many { --tyb-menu-size: 31px; } }
@media (max-height: 600px) {
	.tyb-menu--paper-sans .tyb-menu__call { flex: 1 1 0; padding: 0 8px; min-height: 46px; }
	.tyb-menu--paper-sans .tyb-menu__calllabel { display: none; }
	.tyb-menu--paper-sans .tyb-menu__num { font-size: 15px; }
	.tyb-menu--paper-sans .tyb-menu__value { flex: 1 1 0; font-size: 14px; }
}

/* ───────────────────────────── "paper-index": the editorial one ─────────
   Set like a contents page: a small numeral (01, 02 …) in a narrow column,
   the page names in mixed-case serif on one left edge beside it. The page
   you are on has its numeral in the accent and its name in the italic. Each
   name rises out of a cut on its own baseline, one after another. */
.tyb-menu--paper.tyb-menu--paper-index { --tyb-menu-size: 31px; --tyb-menu-col: 40px; }
.tyb-menu--paper-index .tyb-menu__list { counter-reset: tyb-mm; }
.tyb-menu--paper-index .tyb-menu__item { position: relative; counter-increment: tyb-mm; }
.tyb-menu--paper-index .tyb-menu__item::before {
	content: counter(tyb-mm, decimal-leading-zero);
	position: absolute;
	z-index: 1;
	left: var(--tyb-menu-pad);
	top: 0;
	height: var(--tyb-menu-row);
	display: flex;
	align-items: center;
	padding-top: .55em;
	box-sizing: border-box;
	font-family: var(--tyb-body-font);
	font-size: 11px;
	line-height: 1;
	font-weight: 500;
	letter-spacing: .14em;
	color: var(--tyb-menu-soft);
	pointer-events: none;
}
.tyb-menu--paper-index .tyb-menu__item.is-current::before,
.tyb-menu--paper-index .tyb-menu__item.has-current::before { color: var(--tyb-menu-accent); font-weight: 700; }
.tyb-menu--paper-index .tyb-menu__link { padding-left: calc(var(--tyb-menu-pad) + var(--tyb-menu-col)); }
.tyb-menu--paper-index .tyb-menu__label { font-size: var(--tyb-menu-size); line-height: 1.1; letter-spacing: -.008em; }
.tyb-menu--paper-index .tyb-menu__item.is-current > .tyb-menu__link .tyb-menu__label,
.tyb-menu--paper-index .tyb-menu__item.has-current > .tyb-menu__link .tyb-menu__label { font-style: italic; }
.tyb-menu--paper-index .tyb-menu__item.is-current > .tyb-menu__link::after,
.tyb-menu--paper-index .tyb-menu__item.has-current > .tyb-menu__link::after { display: none; }
.tyb-menu--paper-index .tyb-menu__more { color: var(--tyb-menu-soft); }
.tyb-menu--paper-index .tyb-menu__pm i { height: 1px; margin-top: -.5px; }
.tyb-menu--paper-index .tyb-menu__sub { margin-left: calc(var(--tyb-menu-pad) + var(--tyb-menu-col)); padding-bottom: 12px; }
.tyb-menu--paper-index .tyb-menu__sub.is-leaving { left: calc(var(--tyb-menu-pad) + var(--tyb-menu-col)); }
.tyb-menu--paper-index .tyb-menu__sublink {
	min-height: 42px;
	padding: 3px var(--tyb-menu-pad) 3px 0;
	font-family: var(--tyb-display);
	font-size: 22px;
	line-height: 1.15;
	font-weight: 400;
	letter-spacing: 0;
}
.tyb-menu--paper-index .tyb-menu__sublink[aria-current],
.tyb-menu--paper-index .tyb-menu__sublink[aria-current]:hover { font-weight: 400; font-style: italic; }
/* the wipe: the row itself stays put, the name rises out of its baseline */
.tyb-menu--paper-index.is-js .tyb-menu__item > .tyb-menu__link { opacity: 1; transform: none; transition: none; }
.tyb-menu--paper-index.is-open .tyb-menu__item > .tyb-menu__link { opacity: 1; transform: none; transition: none; }
.tyb-menu--paper-index.is-js .tyb-menu__label {
	transform: translate3d(0, 100%, 0);
	-webkit-clip-path: inset(-.3em -1em 100% -1em);
	clip-path: inset(-.3em -1em 100% -1em);
	transition: transform 0s linear .28s, clip-path 0s linear .28s, -webkit-clip-path 0s linear .28s;
}
.tyb-menu--paper-index.is-open .tyb-menu__label {
	transform: none;
	-webkit-clip-path: inset(-.3em -1em -.3em -1em);
	clip-path: inset(-.3em -1em -.3em -1em);
	transition: transform .46s cubic-bezier(.16, 1, .3, 1), clip-path .46s cubic-bezier(.16, 1, .3, 1), -webkit-clip-path .46s cubic-bezier(.16, 1, .3, 1);
	transition-delay: calc(140ms + var(--i, 0) * 38ms);
}
.tyb-menu--paper-index.is-js .tyb-menu__item::before,
.tyb-menu--paper-index.is-js .tyb-menu__more { opacity: 0; transition: opacity 0s linear .28s; }
.tyb-menu--paper-index.is-open .tyb-menu__item::before { opacity: 1; transition: opacity .22s linear; transition-delay: calc(90ms + var(--i, 0) * 38ms); }
.tyb-menu--paper-index.is-open .tyb-menu__more { opacity: 1; transition: opacity .22s linear, transform .3s var(--tyb-menu-out); transition-delay: calc(300ms + var(--i, 0) * 38ms), 0s; }
.tyb-menu--paper-index.is-open .tyb-menu__item > .tyb-menu__sub { transition: opacity .24s linear, transform .44s cubic-bezier(.16, 1, .3, 1); transition-delay: calc(180ms + var(--i, 0) * 38ms); }
.tyb-menu--paper-index.is-open .tyb-menu__foot > * { transition: opacity .24s linear, transform .4s cubic-bezier(.16, 1, .3, 1); transition-delay: 330ms; }
.tyb-menu--paper-index.is-open .tyb-menu__foot > .tyb-menu__value { transition-delay: 380ms; }
/* the foot keeps the two columns: "Call" under the numerals, the number on the names' edge */
.tyb-menu--paper-index .tyb-menu__call,
.tyb-menu--paper-index .tyb-menu__call:hover { justify-content: flex-start; gap: 0; }
.tyb-menu--paper-index .tyb-menu__calllabel { flex: none; width: var(--tyb-menu-col); letter-spacing: .12em; }
.tyb-menu--paper-index .tyb-menu__value,
.tyb-menu--paper-index .tyb-menu__value:hover { justify-content: space-between; padding-left: 18px; padding-right: 18px; font-size: 14.5px; font-weight: 500; letter-spacing: .01em; text-transform: none; }
.tyb-menu--paper-index .tyb-menu__value::after { content: '\2192'; margin-left: 12px; font-size: 16px; line-height: 1; transition: transform .2s var(--tyb-menu-out); }
.tyb-menu--paper-index .tyb-menu__value.is-pressed::after { transform: translate3d(4px, 0, 0); }
@media (max-height: 660px) { .tyb-menu--paper.tyb-menu--paper-index { --tyb-menu-size: 28px; } .tyb-menu--paper-index .tyb-menu__sublink { font-size: 20px; min-height: 40px; } }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-index { --tyb-menu-size: 38px; --tyb-menu-row: 70px; } .tyb-menu--paper-index .tyb-menu__list { padding-top: 22px; } .tyb-menu--paper-index .tyb-menu__sublink { font-size: 24px; min-height: 46px; } }
.tyb-menu--paper.tyb-menu--paper-index.tyb-menu--many { --tyb-menu-size: 27px; }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-index.tyb-menu--many { --tyb-menu-size: 32px; --tyb-menu-row: 62px; } }
@media (max-width: 374px) { .tyb-menu--paper.tyb-menu--paper-index { --tyb-menu-col: 34px; } }

/* less motion asked for: everything is simply there */
@media (prefers-reduced-motion: reduce) {
	.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper-serif.is-js .tyb-menu__foot > *,
	.tyb-menu--paper-sans.is-js .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper-sans.is-js .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper-sans.is-js .tyb-menu__foot > *,
	.tyb-menu--paper-index.is-js .tyb-menu__label { transform: none; -webkit-clip-path: none; clip-path: none; }
	.tyb-menu--paper-serif.is-js .tyb-menu__link::after { transform: none; }
	.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper-serif.is-open .tyb-menu__foot > *,
	.tyb-menu--paper-sans.is-open .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper-sans.is-open .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper-sans.is-open .tyb-menu__foot > *,
	.tyb-menu--paper-index.is-open .tyb-menu__label,
	.tyb-menu--paper-index.is-open .tyb-menu__item::before,
	.tyb-menu--paper-index.is-open .tyb-menu__more { transition-delay: 0s; }
}
/* ═══════ end ROUND 10 2026-10-05 — the phone menu: three more styles built on paper ═══════ */


/* ══════════════════════════════════════════════════════════════════════════
   ROUND 10d 2026-10-05 — the phone menu, style "paper-serif": the main one
   Adam: "i like the serif one the most… remove the call and their number at
   the bottom… animation a little sleeker and maybe a little slower… contact
   taylor [opens the popup]… not as wide… see it both with grey background
   and white background." This block wins over the serif rules above it.
   ══════════════════════════════════════════════════════════════════════════ */
.tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-row: 62px; --tyb-menu-size: 37px; }
.tyb-menu--paper-serif .tyb-menu__panel { width: min(80vw, 328px); }
.tyb-menu--paper-serif.is-open .tyb-menu__panel { transition: transform .56s cubic-bezier(.16, 1, .3, 1); }
.tyb-menu--paper-serif .tyb-menu__list { padding-top: 18px; }
.tyb-menu--paper-serif .tyb-menu__foot { padding-top: 12px; padding-bottom: max(22px, env(safe-area-inset-bottom, 0px)); }
.tyb-menu--paper-serif .tyb-menu__value,
.tyb-menu--paper-serif .tyb-menu__value:hover { min-height: 52px; }
/* slower and smoother: each row rises 24px and settles, 60ms after the one above */
.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper-serif.is-js .tyb-menu__foot > * { transform: translate3d(0, 24px, 0); }
.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__link,
.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__sub,
.tyb-menu--paper-serif.is-open .tyb-menu__foot > * {
	transform: none;
	transition: opacity .5s cubic-bezier(.4, 0, .2, 1), transform .9s cubic-bezier(.16, 1, .3, 1);
	transition-delay: calc(150ms + var(--i, 0) * 60ms);
}
.tyb-menu--paper-serif.is-open .tyb-menu__foot > *,
.tyb-menu--paper-serif.is-open .tyb-menu__foot > .tyb-menu__value { transition-delay: 460ms; }
.tyb-menu--paper-serif.is-open .tyb-menu__link::after { transition: transform .7s cubic-bezier(.16, 1, .3, 1); transition-delay: calc(420ms + var(--i, 0) * 60ms); }
@media (max-height: 700px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-row: 60px; --tyb-menu-size: 36px; } }
@media (max-height: 660px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-row: 54px; --tyb-menu-size: 32px; } }
@media (max-height: 600px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-row: 50px; --tyb-menu-size: 30px; } .tyb-menu--paper-serif .tyb-menu__foot { flex-direction: column; } }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-serif { --tyb-menu-row: 78px; --tyb-menu-size: 44px; } .tyb-menu--paper-serif .tyb-menu__list { padding-top: 34px; } }
.tyb-menu--paper.tyb-menu--paper-serif.tyb-menu--many { --tyb-menu-row: 54px; --tyb-menu-size: 32px; }
@media (max-height: 660px) { .tyb-menu--paper.tyb-menu--paper-serif.tyb-menu--many { --tyb-menu-row: 50px; --tyb-menu-size: 29px; } }
@media (min-height: 800px) { .tyb-menu--paper.tyb-menu--paper-serif.tyb-menu--many { --tyb-menu-row: 66px; --tyb-menu-size: 38px; } }
@media (prefers-reduced-motion: reduce) {
	.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper-serif.is-js .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper-serif.is-js .tyb-menu__foot > * { transform: none; }
	.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__link,
	.tyb-menu--paper-serif.is-open .tyb-menu__item > .tyb-menu__sub,
	.tyb-menu--paper-serif.is-open .tyb-menu__foot > *,
	.tyb-menu--paper-serif.is-open .tyb-menu__link::after { transition-delay: 0s; }
}
/* the two grounds to compare */
.tyb-menu--paper.tyb-menu--paper-serif-white { --tyb-menu-ground: #FFFFFF; }
.tyb-menu--paper.tyb-menu--paper-serif-grey {
	--tyb-menu-ground: var(--tyb-menu-slate, #212324);
	--tyb-menu-ink:    #FFFFFF;
	--tyb-menu-quiet:  rgba(255, 255, 255, .8);
	--tyb-menu-soft:   rgba(255, 255, 255, .64);
	--tyb-menu-accent: var(--tyb-menu-mark, #D24E28);
}
.tyb-menu--paper-serif-grey .tyb-menu__ground { box-shadow: -28px 0 56px -8px rgba(0, 0, 0, .4); }
.tyb-menu--paper-serif-grey .tyb-menu__value,
.tyb-menu--paper-serif-grey .tyb-menu__value:hover { background: #FFFFFF; color: var(--tyb-menu-slate, #212324); }
.tyb-menu--paper-serif-grey .tyb-menu__close.is-pressed { background-color: rgba(255, 255, 255, .1); }
/* ═══════ end ROUND 10d 2026-10-05 — the phone menu, style "paper-serif": the main one ═══════ */

/* ══ TONY AYOUB 2026-10-05 — the Arabic page (/arabic/), right to left ══════
   templates/custom.php wraps the page in .tyb-rtl[dir=rtl]. Both type tokens
   point at an Arabic face. Letter-spacing is zeroed: tracking pulls Arabic
   letters apart, and they are written joined. */
.tyb-rtl {
	--tyb-display:   'IBM Plex Sans Arabic', 'SF Arabic', 'Geeza Pro', 'Noto Sans Arabic', 'Segoe UI', Tahoma, sans-serif;
	--tyb-body-font: 'IBM Plex Sans Arabic', 'SF Arabic', 'Geeza Pro', 'Noto Sans Arabic', 'Segoe UI', Tahoma, sans-serif;
	text-align: start;
}
.tyb-rtl,
.tyb-rtl * { letter-spacing: 0 !important; }
.tyb-rtl h1,
.tyb-rtl h2,
.tyb-rtl h3 { font-weight: 600; line-height: 1.4; }
.tyb-rtl p,
.tyb-rtl li { line-height: 1.9; }
/* A phone number stays left to right inside the right-to-left page. */
.tyb-rtl a[href^="tel:"],
.tyb-rtl a[href^="tel:"] * { direction: ltr; unicode-bidi: isolate; }

/* ══ TONY AYOUB 2026-10-05 — AREA GUIDES (/areas/ and /areas/<town>/) ════════
   templates/guide.php and templates/areas.php. Facts at a glance in a card
   that stays beside the sections on desktop and sits above them on a phone. */
.tyb-guide__body { padding-top: clamp(1.6rem, 4vw, 3rem); }
.tyb-guide__crumbs {
	display: flex; flex-wrap: wrap; gap: .5rem;
	font-size: .82rem; color: var(--tyb-muted);
	margin-bottom: clamp(1.4rem, 3vw, 2.2rem);
}
.tyb-guide__crumbs a { color: var(--tyb-muted); text-decoration: underline; text-underline-offset: 3px; }
.tyb-guide__crumbs a:hover { color: var(--tyb-brand); }
.tyb-guide__grid {
	display: grid;
	grid-template-columns: minmax(0, 21rem) minmax(0, 1fr);
	gap: clamp(2rem, 5vw, 4.5rem);
	align-items: start;
}
.tyb-guide__aside { position: sticky; top: calc(var(--tyb-header-h, 96px) + 1.5rem); display: grid; gap: 1.5rem; }
.tyb-guide__card {
	background: #fff;
	border: 1px solid var(--tyb-line);
	border-radius: 14px;
	padding: 1.6rem 1.5rem 1.5rem;
	box-shadow: 0 18px 40px -28px rgba(27, 30, 34, .35);
}
.tyb-guide__facts { margin: 1rem 0 1.4rem; }
.tyb-guide__facts > div { padding: .75rem 0; border-top: 1px solid var(--tyb-line); }
.tyb-guide__facts > div:first-child { border-top: 0; padding-top: .2rem; }
.tyb-guide__facts dt {
	font-size: .7rem; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
	color: var(--tyb-muted); margin-bottom: .2rem;
}
.tyb-guide__facts dd { margin: 0; font-size: .98rem; line-height: 1.45; color: var(--tyb-ink, var(--tyb-brand)); }
.tyb-guide__ask { display: flex; justify-content: center; width: 100%; text-align: center; }
.tyb-guide__toc { padding: 0 .25rem; }
.tyb-guide__toc-title {
	display: block; font-size: .7rem; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
	color: var(--tyb-muted); margin-bottom: .6rem;
}
.tyb-guide__toc ul { list-style: none; margin: 0; padding: 0; }
.tyb-guide__toc li { border-top: 1px solid var(--tyb-line); }
.tyb-guide__toc a { display: block; padding: .6rem 0; font-size: .93rem; color: var(--tyb-body, inherit); text-decoration: none; }
.tyb-guide__toc a:hover { color: var(--tyb-accent); }
.tyb-guide__article { max-width: 44rem; }
.tyb-guide__sec { scroll-margin-top: calc(var(--tyb-header-h, 96px) + 1.5rem); }
.tyb-guide__sec + .tyb-guide__sec { margin-top: clamp(2rem, 4vw, 3rem); padding-top: clamp(2rem, 4vw, 3rem); border-top: 1px solid var(--tyb-line); }
.tyb-guide__h {
	font-family: var(--tyb-display); font-weight: 400;
	font-size: clamp(1.7rem, 3.2vw, 2.3rem); line-height: 1.12; letter-spacing: -.01em;
	color: var(--tyb-brand); margin: 0 0 1rem;
}
.tyb-guide__article p { font-size: 1.06rem; line-height: 1.75; margin: 0 0 1.1rem; }
.tyb-guide__article p:last-child { margin-bottom: 0; }
#questions { scroll-margin-top: calc(var(--tyb-header-h, 96px) + 1rem); }
.tyb-towns5__more { margin: clamp(1.6rem, 3vw, 2.4rem) 0 0; text-align: center; }
.tyb-guide__index .tyb-h5 { margin-bottom: clamp(1.4rem, 3vw, 2.2rem); }
.tyb-guide__counties { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(1.5rem, 4vw, 4rem); }
.tyb-guide__county { font-family: var(--tyb-display); font-weight: 400; font-size: 1.5rem; margin: 0 0 .6rem; color: var(--tyb-brand); }
.tyb-guide__counties ul { list-style: none; margin: 0; padding: 0; }
.tyb-guide__counties li { border-top: 1px solid var(--tyb-line); }
.tyb-guide__counties a { display: block; padding: .7rem 0; color: var(--tyb-body, inherit); text-decoration: none; }
.tyb-guide__counties a:hover { color: var(--tyb-accent); }
@media (max-width: 900px) {
	.tyb-guide__grid { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
	.tyb-guide__aside { position: static; }
	.tyb-guide__toc { display: none; }
	.tyb-guide__counties { grid-template-columns: minmax(0, 1fr); }
}
/* Photo credits page. */
.tyb-credits__list { list-style: none; margin: 1.5rem 0 0; padding: 0; }
.tyb-credits__list li { padding: .8rem 0; border-top: 1px solid var(--tyb-line); font-size: .95rem; line-height: 1.6; }
.tyb-credits__list a { color: var(--tyb-accent); text-decoration: underline; text-underline-offset: 3px; }

/* ══ TONY AYOUB 2026-10-05 — the agent portal (bb-agent-portal) ══════════════
   The plugin's stylesheet loads after this one and sets its own .bbap
   defaults, so `body .bbap` is needed to win (themes/CLAUDE.md trap 51). No
   floating call pill on the portal: it sat over the forms. */
body .bbap { --bbap-accent: var(--tyb-accent); --bbap-accent-ink: #ffffff; }
body.bbap-portal-page .tyb-callbar { display: none !important; }
.tyb-postvideo {
	display: block; width: 100%;
	margin: 0 0 clamp(1.5rem, 3vw, 2.2rem);
	background: #000; border-radius: 14px;
}

/* The portal's sign-in screen as ONE CARD: the brand's dark panel beside the
   form, the look Adam approved on tim-duval's stand-in page (2026-10-05). The
   plugin prints only .bbap-signin (a heading, a line, one field, a button), so
   the panel is drawn here and the plugin is not touched. */
body .bbap:has(> .bbap-signin) { max-width: none; background: var(--tyb-tint); padding: clamp(2.5rem, 6vw, 5.5rem) 1rem; }
body .bbap .bbap-signin {
	box-sizing: border-box;
	position: relative;
	display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); align-content: center;
	max-width: 58rem; min-height: 26rem; margin-inline: auto; padding: 0;
	background: #fff; border-radius: 14px; overflow: hidden;
	box-shadow: 0 30px 70px -34px rgba(12, 18, 22, .45), 0 2px 6px rgba(12, 18, 22, .06);
}
/* The panel is positioned over the card's first column. Its width is a share
   of the CARD (the card is its containing block); a percentage PADDING would
   be measured on the page instead. */
body .bbap .bbap-signin::before {
	content: "Everything for your site, in one place.";
	position: absolute; inset: 0 auto 0 0; width: calc(100% * 5 / 11); box-sizing: border-box;
	display: flex; align-items: flex-end;
	padding: clamp(1.75rem, 4vw, 3rem);
	background: var(--tyb-brand) url("../img/logo-light.png") no-repeat clamp(1.75rem, 4vw, 3rem) clamp(1.75rem, 4vw, 3rem) / min(60%, 14rem) auto;
	color: #fff; font-family: var(--tyb-display);
	font-size: clamp(1.6rem, 1.1rem + 1.6vw, 2.15rem); line-height: 1.12;
}
body .bbap .bbap-signin > * { grid-column: 2; margin-inline: clamp(1.75rem, 4vw, 3rem); }
body .bbap .bbap-signin > :first-child { margin-top: clamp(1.75rem, 4vw, 3rem); }
body .bbap .bbap-signin > :last-child { margin-bottom: clamp(1.75rem, 4vw, 3rem); }
body .bbap .bbap-signin .bbap-title { font-size: clamp(1.9rem, 1.3rem + 2vw, 2.6rem); line-height: 1.08; }
@media (max-width: 760px) {
	body .bbap .bbap-signin { grid-template-columns: minmax(0, 1fr); min-height: 0; }
	body .bbap .bbap-signin::before { display: none; }
	body .bbap .bbap-signin > * { grid-column: 1; }
}
