@charset "UTF-8";
/* CSS Document */

/* Design tokens — the site's actual recurring values, centralized so a value only needs checking/changing
   in one place. Added after three separate rounds of rework from guessing at these instead of referencing
   them (see CLAUDE.md's "Base style reference"). Existing inline styles use var(--token-name) instead of
   the literal value; new inline styles should do the same rather than retyping a hex/em value from memory. */
:root {
	/* Colors */
	--color-yellow-bright: yellow;   /* nav bar accent (.yellowFrame), footer contact-box divider bar */
	--color-yellow-accent: #F5E642;  /* documented brand accent — NOT currently used anywhere live; kept as a
	                                     reference in case it returns (it was the testimonial border color
	                                     before that redesign removed it) */
	--color-gray-box: #F2F2F2;       /* client-logo box background */
	--color-link: blue;              /* matches the `a, a:visited` rule below — reference this instead of
	                                     retyping "blue" so an inline override and the site default can never
	                                     silently drift apart */
	--color-text-black: black;
	/* Muted text: photo credits, form hints, "(optional)" labels. Was the CSS keyword `grey`
	   (#808080), which fails WCAG AA for normal-size text on BOTH backgrounds it's used on:
	   about 3.9:1 on white and 3.4:1 on the #F2F2F2 grey box, against a 4.5:1 requirement.
	   #666666 gives 5.7:1 on white and 5.1:1 on the grey box — comfortably AA, and dark enough
	   to still read as secondary rather than body text. Don't lighten it back. */
	--color-caption-gray: #666666;
	--color-white: white;

	/* Section-heading sizes — two real, corroborated tiers, not one. Primary (1.9em) is used for main
	   content-block headings (About Us's 4 sections, What We Do's two service headings, Join's two
	   headings, Home's "A Personal Agency"). Secondary (1.6em) recurs specifically for closing/centered
	   headings — Home's "Testimonials"/"Selected Clients", What We Do's closing "Not sure which fits?",
	   and both of Contact's headings — 5 occurrences across 3 pages, not drift. Both tiers share the same
	   1.3em on mobile — the primary/secondary split only exists at the desktop size.
	   Home's "How We Help" (1.7em) matches NEITHER tier and appears nowhere else — a genuine one-off,
	   left as a literal value and flagged rather than silently folded into either tier. See CLAUDE.md. */
	--font-size-heading-desktop: 1.9em;
	--font-size-heading-secondary-desktop: 1.6em;
	--font-size-heading-mobile: 1.3em;

	/* The one content width for the whole site. Change here, everything follows.
	   See .contentColumn in the responsive layer at the bottom of this file. */
	--content-max-width: 1400px;
}

html, body {
	font-family: museo-sans, "Helvetica Neue", Helvetica, Arial, "sans-serif";
	font-size: 19px;
	line-height: 30px;
	font-weight: 500;
	height: 100%;
	-webkit-overflow-scrolling: touch;
	overflow-x: hidden; /* This is preventing Window scrolling. Purpose is to make the elements fit the site.*/
}
h1 {
	font-size: 2.2em;
	margin-bottom: 0.4em;
	font-weight: 900;
}
h2 {
	font-size: 1.7em;
	font-weight: 900;
	padding-top: 1.2em;
}
h3 {
	font-size: 1.15em;
	font-weight: 900;
	padding-top: 1em;
	margin-bottom: 0em;
	line-height: 1.3em;
}

a, a:visited {
	color: var(--color-link);
	text-decoration:none;
}

p{
	margin-top: 0.5em;
	margin-bottom: 1.2em;
}






/* CUSTOM STYLES */

.navigation a {
	color: black;
	text-decoration: none;
}

.navigation a:hover {
	color: blue;
	text-decoration: underline;
}


.navigation h3 {
	margin-bottom: 0em;
}

.smallNavi{
	margin-bottom: 0em;
	
}

.smallNavi a{
	color: black;
}

.smallNavi a:hover{
	color: blue;
}


.yellowFrame {
	background-color: var(--color-yellow-bright);
	height: 30px;
	margin-bottom: 20px;
}
.top-buffer {
	margin-top: 20px;
}
.bottom-buffer {
	margin-bottom: 30px;
}

.bottom-medium-buffer {
	margin-bottom: 50px;
}

.bottom-big-buffer {
	margin-bottom: 100px;
}

.bottom-xl-buffer {
	margin-bottom: 200px;
}

.bigger {
	font-size: 1.2em;
	line-height: 1.6em;
}


.h1Big {
	font-size: 3em;
	line-height: 1.3em;
}


.textFrame {
	max-width: 40em;
	padding: 3em;
	border: 1px solid black;
	background-color: white;
}


/*.textFramePraise {
	max-width: 28em;
	padding: 0em;
	border: none;
	margin-right: auto; 
	margin-left: auto;
	z-index: 15;
	position: relative;
}*/

.clientsContent{
	
	max-width: 34em;
	margin-left: auto;
	margin-right: auto;
	z-index: 10;
	position: relative;
	
}

.areaEvolve {
	height: 1200px;
}

.rectangle {
	width: 7rem;
	height: 7rem;
}

.circle {
	height: 250px;
	width: 250px;
	border-radius: 50%;
	display: inline-block;
}

.colorA {
	background-color: blue;
}

.colorB {
	color: blue;
}

.colorC {
	color: blue;
}

.stronger {
	font-weight: 900;
}

.navigation {
	position: fixed;
	padding: 30px 30px 30px 30px;
	top: 0px;
	left: 15px;
	z-index: 1;
	background-color: white;
	width: 230px;
}

#navigationSMALL {
	background-color: white;
	border-bottom: 20px solid yellow;
	position: fixed;
	z-index: 1;
	-webkit-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.2);
	-moz-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.2);
	box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.2);
}

.versal {
	text-transform: uppercase;
}
.currentSite {
	color:red;
}


.chronologicalBoxShort{
	width: 10px; 
	height: 45px; 
	background-color: blue; 
	margin-bottom: 0px; 
	margin-top: 30px;
	left: 20px;
	position: relative;
}

.chronologicalBoxLong{
	width: 10px; 
	height: 145px; 
	background-color: blue; 
	margin-bottom: 0px; 
	margin-top: 30px;
	left: 20px;
	position: relative;
}

/* top+bottom (not a fixed height) so this stretches to match the label's own rendered height.
   It used to be a flat `height: 50px`, tuned for a one-line label — on a two-line label (e.g.
   Portuguese "O que fazemos" / "Junte-se a nós" in the narrow 230px nav column) the box only
   covered the first line, leaving the second line sitting on plain white. top:8/bottom:-8 keeps
   the exact same box position and size for one-line labels (verified live) while auto-extending
   for two-line ones. */
.currentGfx{
	position: absolute;
	top:8px;
	left: -35px;
	bottom: -8px;
	width: 240px;
	background-color: yellow;
	z-index: -1;
	margin: 0px;
	pading: 0px;

}

.currentGfxSmall{
	position: absolute;
	top:8px;
	left: -10px;
	bottom: -8px;
	width: 300%;
	background-color: yellow;
	z-index: -1;
	margin: 0px;
	pading: 0px;

}

.gfxUnderline{
	
	border-bottom: 15px solid yellow; 
	padding-bottom: 0.5em;
	
}


.yellowLineTop{
	position: relative;
	z-index: 20;
	padding-bottom: 1em;
	width: 250px;
	height: 250px;
	background-color: black;
	
}

.BoxStatus{
	float:left;
	margin-right: 26px;
}

/*
.BoxStatus{
	float:left;
	padding: 0px 32px;
}*/

button{
	padding: 0px !important;
}

/* Padding was the ONLY real difference between .greyBox and .greyBoxMobile, so it's a
   media query now rather than a second class. Safe to change in place: every .greyBox on
   the live site currently sits inside a `d-none d-lg-block` wrapper, so the new below-lg
   padding can't reach a page that hasn't been migrated yet. */
.greyBox{
	background-color: var(--color-gray-box);
	margin: auto;
	padding: 1.5em;
}
@media (min-width: 992px) {
	.greyBox{
		padding: 6.5em;
	}
}

/* LEGACY — for pages still written as duplicated desktop/mobile blocks. Identical to
   .greyBox below the lg breakpoint. Don't use in new markup; delete once every page
   has been migrated off the duplication pattern. */
.greyBoxMobile{
	background-color: var(--color-gray-box);
	margin: auto;
	padding: 1.5em;
}

.greyBoxContent{
	max-width: 33em; 
	margin: auto;
}


.blackBoxBorder{
	border: 1px solid blue;
	max-width: 60%; 
	margin-right: auto;
	margin-left: auto;
	margin-top: 5rem;
	margin-bottom: 4rem;
	padding: 3.5em;
}


.blackBoxBorderMobile{
	border: 1px solid blue;
	max-width: 100%; 
	margin-right: auto;
	margin-left: auto;
	margin-top: 2.5rem;
	margin-bottom: 2rem;
	padding: 1.5em;
}


ol {
  list-style: none;
  counter-reset: my-awesome-counter;
  display: flex;
  flex-wrap: wrap;
  margin: 0;
  padding: 0;
}
ol li {
	counter-increment: my-awesome-counter;
	display: flex;
	margin-bottom: 1.2em;
}
ol li::before {
	content: counter(my-awesome-counter);
	font-weight: 900;
	font-size: 3.3rem;
	margin-right: 0.5rem;
	line-height: 1;
	color: white;
	-webkit-text-stroke: 2px blue;
}

li:first-child {
 margin-top: 1rem;
}

.card{

	width: 100%;
	max-width: 1100px;
	margin:auto;
	position: relative;
}

.whiteBox{
	font-weight: 900;
	margin: 1em 0em 1em 0em;
	
}

.contentCenter{
	max-width: 33em;
	margin-left: auto;
	margin-right: auto;
}

.contentCenterQuote{
	font-weight: 900;
	margin:3em 0em 3em 0em;
	max-width: 42em;
    margin-right: auto;
    margin-left: auto;
}

.verticalLine_1{
	
	position: relative; 
	width: 15px; 
	height: 125px; 
	background-color: #D1D1D1; 
	left: 25px; 
	margin-bottom: 20px;
	
}

.blackLine{
	width: 90%;
	height: 1px;
	background-color: black;
	margin-bottom: 20px;
}




/* ============================================================================
   RESPONSIVE LAYER

   Historically this site had NO media queries at all — every section was written
   out twice in the markup, once inside `d-none d-lg-block` (desktop) and once
   inside `d-block d-lg-none` (mobile), with font sizes set inline separately in
   each copy. That is why a single visual change used to mean editing two places,
   why the two copies drifted apart, and why tablets (768–991px) got the phone
   layout — phone font sizes and all.

   These classes replace that pattern: ONE block of markup, sizes handled here.
   Values below reproduce the previous rendering exactly at both breakpoints, so
   migrating a file is a refactor, not a redesign.

   Breakpoints deliberately match Bootstrap 4's own (sm 576px, lg 992px) so these
   rules and any remaining `d-*` utilities agree with each other.
   ============================================================================ */

/* ----------------------------------------------------------------------------
   COLLECTIONS — Results articles and the Results listing.
   Markup is written once (inc/collection-article.php / -listing.php); all
   breakpoint differences live here. Replaces .contentCenter/.contentCenterQuote,
   which are kept further up only for the not-yet-migrated legacy pages.
   ---------------------------------------------------------------------------- */

.articleBack {
	margin-bottom: 0.5em;
}

.articleMeta {
	margin: 0;
	font-size: 0.9em;
}

.articleTitle {
	font-size: 1.6em;
	margin-top: 0.2em;
	margin-bottom: 0.8em;
}
@media (min-width: 992px) {
	.articleTitle {
		font-size: 2em;
		line-height: 1.3em;
	}
}

.articleHero img {
	width: 100%;
	height: auto;
}

/* Reading measure. 34em is the width the original articles used and it's a sound line length —
   roughly 65-75 characters. Kept centred within the content column, as before. */
.articleBody {
	margin-top: 2em;
	margin-bottom: 2em;
}

.articleText {
	max-width: 34em;
	margin-left: auto;
	margin-right: auto;
	font-size: 1em;
	line-height: 30px;
}
@media (min-width: 992px) {
	.articleText {
		font-size: 1.2em;
		line-height: 1.6em;
	}
}

/* Pull quotes are deliberately WIDER (42em) and heavier (900) than body text, so they break the
   reading rhythm — that's the original treatment, preserved. The quote marks come from the
   template, not the content, so the quote string stays identical to the sentence it echoes. */
.articleQuote {
	max-width: 42em;
	margin: 2em auto;
	font-weight: 900;
	font-size: 1.15em;
	line-height: 1.4em;
	text-align: center;
}
@media (min-width: 992px) {
	.articleQuote {
		margin: 3em auto;
		font-size: 1.45em;
	}
}

/* No current article uses a subheading; the type exists so adding one never needs a template
   change. Sized between the title and body so the hierarchy reads correctly if it appears. */
.articleSubhead {
	max-width: 34em;
	margin: 1.5em auto 0.5em auto;
	padding-top: 0;
	font-size: var(--font-size-heading-mobile);
}
@media (min-width: 992px) {
	.articleSubhead {
		font-size: var(--font-size-heading-secondary-desktop);
	}
}

.articleImage {
	max-width: 34em;
	margin: 2em auto;
}
.articleImage--full {
	max-width: 100%;
}
.articleImage img {
	width: 100%;
	height: auto;
}

.articleDivider {
	border: none;
	border-top: 1px solid var(--color-text-black);
	max-width: 34em;
	margin: 3em auto 2em auto;
}

/* The closing divider spans the content column, not the reading measure, because the
   previous/next cards below it are two columns wide. */
.articleDivider--wide {
	max-width: 100%;
	margin: 3em 0 2.5em 0;
}

/* Previous / next story cards. Reproduces the treatment the old portfolio articles used —
   direction label with arrow, title, image, "read more" — as two side-by-side cards, but
   stacking on narrow screens, which the original (fixed 50% inline-flex) didn't do. */
.articleNav {
	display: flex;
	flex-wrap: wrap;
	margin: 0 0 5em 0;
}

/* min-width: 0 is load-bearing, not tidying. Flex items default to `min-width: auto`, which
   refuses to shrink below the intrinsic width of their content — and these cards contain a
   1920px-wide image. Without it the item is forced to 1920px, blows past its 50% basis and
   overflows the content column entirely. This is the classic flexbox image-overflow trap. */
.articleNavItem {
	flex: 0 0 100%;
	min-width: 0;
	box-sizing: border-box;
	margin-bottom: 3em;
}

@media (min-width: 768px) {
	.articleNavItem {
		flex: 0 0 50%;
		margin-bottom: 0;
	}
	.articleNavItem--prev {
		padding-right: 10px;
	}
	/* margin-left: auto keeps "next" on the RIGHT even when it's the only card — which is the
	   case on the first article in the running order, where there is no previous story. Without
	   it the lone next-card falls into the left slot simply because it's the first child. */
	.articleNavItem--next {
		padding-left: 10px;
		margin-left: auto;
	}
	/* Mirrors the original: the "next" label sits against the right edge so the pair reads
	   outward from the centre. Only the label flips, not the title or body. */
	.articleNavItem--next .articleNavDir {
		text-align: right;
	}
}

.articleNavDir {
	margin: 0 0 0.2em 0;
	font-weight: 900;
	font-size: 1.15em;
}

.articleNavTitle {
	padding-top: 0;
	margin-bottom: 0.6em;
	font-size: 1.15em;
	line-height: 1.35em;
}
.articleNavTitle a {
	color: var(--color-text-black);
}
.articleNavTitle a:hover {
	color: var(--color-link);
}

.articleNavImage {
	display: block;
	margin-bottom: 0.8em;
}
.articleNavImage img {
	width: 100%;
	max-width: 100%;
	height: auto;
}


/* ----------------------------------------------------------------------------
   Safety net: no image may exceed its container.

   Deliberately scoped to the rebuilt sections rather than applied to every <img>
   on the site — the legacy pages (About Us's decorative line graphics, the old
   portfolio articles) use deliberately oversized elements that break their column
   on purpose, and a blanket `img { max-width: 100% }` would silently change them.
   Widen this selector list as each remaining page is migrated.
   ---------------------------------------------------------------------------- */
.articleBody img,
.articleHero img,
.articleNavImage img,
.resultCardImage img,
.bannerPhoto img {
	max-width: 100%;
}

/* --- Listing --- */

/* 4em here plus the trailing paragraph's own 1.2em put roughly 100px between one card's
   "read the full story" link and the next card's grey rule — far more separation than the
   cards needed. */
/* margin: 0 auto, not the site's usual left-align-to-column rule — these cards are narrower than
   the greyBox above them, and left-aligning left them sitting off to the left with a large gap on
   the right instead of reading as centred under the box. */
.resultCard {
	margin: 0 auto 2em auto;
	max-width: 40em;
}
.resultCard > p:last-child {
	margin-bottom: 0;
}

/* The short vertical rule above each card — the old listing's .verticalLine_1, scoped here so it
   doesn't depend on a legacy class. */
.resultCardRule {
	width: 15px;
	height: 90px;
	background-color: #D1D1D1;
	margin-bottom: 1em;
}

.resultCardTitle {
	padding-top: 0.2em;
	margin-bottom: 0.6em;
	font-size: 1.4em;
	line-height: 1.3em;
}
@media (min-width: 992px) {
	.resultCardTitle {
		font-size: 1.8em;
	}
}
.resultCardTitle a {
	color: var(--color-text-black);
}
.resultCardTitle a:hover {
	color: var(--color-link);
}

.resultCardImage {
	display: block;
	margin-bottom: 1em;
}
.resultCardImage img {
	width: 100%;
	height: auto;
}


/* ----------------------------------------------------------------------------
   WHAT WE DO — page-specific classes, extracted while splitting the page into
   inc/what-we-do-template.php + lang/{code}.php. Every value below reproduces
   what was previously two hand-tuned, independently-iterated inline styles
   (desktop d-none/d-block copy + mobile copy) — nothing here is a new design
   decision, only a move from inline duplication to one responsive definition.
   ---------------------------------------------------------------------------- */

/* The "One method. Real results." headline. Deliberately pulled up to overlap the
   banner photo / yellow square above it — the -70px/-74px top offsets and the
   4em/2.2em size jump were tuned live against the real render, not calculated. */
.heroSlogan {
	font-size: 2.2em;
	padding-top: 0;
	margin-top: 2em;
	position: relative;
	z-index: 2;
	top: -74px;
	text-align: center;
}
@media (min-width: 992px) {
	.heroSlogan {
		font-size: 4em;
		margin-top: 0.8em;
		top: -70px;
	}
}

/* Compensates for .heroSlogan's negative top offset: without it, the intro box below
   sits in the SPACE the headline would have occupied before being pulled up, leaving
   a large gap. Desktop doesn't need this — the desktop offset is smaller relative to
   the surrounding spacing and looked correct without a matching pull-up. */
.introSection {
	margin-top: -50px;
	margin-bottom: 2em;
}
@media (min-width: 992px) {
	.introSection {
		margin-top: 0;
		margin-bottom: 3em;
	}
}

/* "Design: Digital Services" / "Design: Sales Outreach" — large and centered, but
   (unlike .heroSlogan) NOT pulled up over the illustration above it; that overlap
   was tried and explicitly reverted. */
.serviceHeading {
	font-size: 2.2em;
	padding-top: 0;
	margin-bottom: 0.6em;
	text-align: center;
}
@media (min-width: 992px) {
	.serviceHeading {
		font-size: 4em;
		margin-bottom: 0.8em;
	}
}

.serviceIllustrationWrap {
	text-align: center;
	margin-top: 2em;
}
@media (min-width: 992px) {
	.serviceIllustrationWrap {
		margin-top: 3em;
	}
}

.serviceIllustrationWrap img {
	width: 100%;
	height: auto;
}
@media (min-width: 992px) {
	.serviceIllustrationWrap img {
		width: 80%;
	}
}

/* Applied to the page's LAST service section only, so its grey box doesn't butt
   straight into the footer. */
.serviceBoxWrap {
	margin-bottom: 4em;
}
@media (min-width: 992px) {
	.serviceBoxWrap {
		margin-bottom: 6em;
	}
}


/* ----------------------------------------------------------------------------
   FORMS — Contact and Join. Markup is written once (see inc/form-handler.php)
   and sized here.
   ---------------------------------------------------------------------------- */
.dgForm {
	max-width: 34em;
	margin-top: 1.5em;
}

.formField {
	margin-bottom: 1.4em;
}

.formField label {
	display: block;
	font-weight: 700;
	margin-bottom: 0.2em;
}

.formOptional {
	font-weight: 500;
	color: var(--color-caption-gray);
}

.formHint {
	display: block;
	font-size: 0.85em;
	color: var(--color-caption-gray);
	margin-bottom: 0.35em;
}

.formField input,
.formField textarea {
	width: 100%;
	font-family: inherit;
	font-size: 1em;
	line-height: 1.5;
	padding: 0.6em 0.7em;
	border: 2px solid var(--color-text-black);
	background-color: var(--color-white);
	box-sizing: border-box;
	border-radius: 0;
	-webkit-appearance: none;
}

.formField textarea {
	resize: vertical;
}

/* A visible focus ring is the whole point — never replace this with outline: none. */
.formField input:focus,
.formField textarea:focus {
	outline: 3px solid var(--color-link);
	outline-offset: 2px;
}

.formField input[aria-invalid="true"],
.formField textarea[aria-invalid="true"] {
	border-color: #C00;
}

/* Errors carry a word, not just the red border — colour alone isn't perceivable for
   everyone, and the border disappears entirely in forced-colours/high-contrast modes. */
.formError {
	display: block;
	color: #C00;
	font-weight: 700;
	font-size: 0.9em;
	margin-top: 0.3em;
}

.formSubmit {
	font-family: inherit;
	font-size: 1.1em;
	font-weight: 700;
	color: var(--color-white);
	background-color: var(--color-link);
	border: none;
	padding: 0.7em 1.6em !important;
	cursor: pointer;
}

.formSubmit:hover {
	background-color: var(--color-text-black);
}

.formSubmit:focus {
	outline: 3px solid var(--color-text-black);
	outline-offset: 2px;
}

/* Blue rule, not yellow: the confirmation sits on the #F2F2F2 grey box, and bright yellow against
   that has almost no luminance contrast — the marker was effectively invisible. Blue is the site's
   existing accent and reads clearly on both white and the grey box. */
.formConfirmation {
	max-width: 34em;
	margin-top: 1.5em;
	padding: 1.5em;
	background-color: var(--color-white);
	border-left: 12px solid var(--color-link);
}

/* Spam honeypot. display:none (not a clip/off-screen technique) so assistive tech skips it
   entirely rather than reading it out to a screen-reader user who would then fill it in and
   have their genuine message silently discarded. */
.formHoneypot {
	display: none;
}


/* Readable line length for body copy that ISN'T inside a .greyBoxContent (which carries its own
   33em measure). The content column is deliberately wide — it's an alignment rule, not a text
   width — so prose inside it needs its own cap: at 1400px an unconstrained column runs to roughly
   110 characters per line, about double the comfortable range.
   Used where a page's text sits directly in the column, e.g. About Us. */
.measure {
	max-width: 35em;
}


/* ----------------------------------------------------------------------------
   THE CONTENT COLUMN — the site's single alignment rule.

   Put this on a plain <div> INSIDE the Bootstrap column, then put every visible
   element of that section inside it. Because each section's content shares one
   wrapper with one max-width, every element on the page gets identical left and
   right edges automatically — alignment by construction, not by repeating the
   same max-width and hoping the nesting matches.

   Why a wrapper div and not the .col itself: a background painted on the .col
   fills the col's 15px padding too, while children of the col start *inside*
   that padding. That was a permanent 30px overhang — the old yellow bar was
   wider than every grey box beneath it at every viewport size. Keeping the cap
   on an inner div means backgrounds and content share one edge.

   Don't add `max-width` to individual sections any more. If the site should be
   narrower or wider, change --content-max-width once, in :root.

   The explicit margins matter: .greyBox carries `margin: auto` from the original
   stylesheet, which CENTRES the box inside the column once a max-width caps it.
   Boxes that happened to have an inline `margin: 0 ...` left-aligned while ones
   without it drifted right by half the leftover space — the two service boxes on
   What We Do sat visibly right of the intro box above them. Content on this site
   left-aligns to the column; deliberate centring belongs on an INNER element
   (see Home's Personal Agency), never on .contentColumn itself.
   ---------------------------------------------------------------------------- */
.contentColumn {
	max-width: var(--content-max-width);
	margin-left: 0;
	margin-right: auto;
}


/* Page banner title — the one <h1> per page. Three inline-styled copies before
   (xl 2.8em / lg 2.4em / mobile 1.6em); the `line-height` at lg+ is what the old
   `.h1Big` class contributed, kept so wrapping is unchanged. */
.bannerTitle {
	font-size: 1.6em;
	margin-top: 0.5em;
	margin-bottom: 1em;
}
@media (min-width: 992px) {
	.bannerTitle {
		font-size: 2.4em;
		line-height: 1.3em;
		/* 0.8em, not the 1em this replaced — tightens the gap between the yellow bar and the
		   title at desktop. Mobile keeps its own 0.5em. */
		margin-top: 0.8em;
	}
}
@media (min-width: 1200px) {
	.bannerTitle {
		font-size: 2.8em;
	}
}

/* Banner photo wrapper. Doubles as the positioning context for .bannerAccent and
   as the small-print styling for the optional photo-credit caption underneath. */
.bannerPhoto {
	position: relative;
	font-size: 12px;
	color: var(--color-caption-gray);
	text-align: right;
	line-height: 16px;
}
@media (min-width: 576px) {
	.bannerPhoto {
		text-align: center;
		line-height: 30px;
	}
}

/* Decorative yellow square straddling the bottom edge of a banner photo.
   Purely decorative — it carries no meaning, so it stays an empty <div> with no
   alt/aria equivalent. Sizes were tuned live; they are NOT arbitrary, so change
   them here rather than re-deriving them inline. */
.bannerAccent {
	position: absolute;
	bottom: -70px;
	left: 50%;
	transform: translateX(-50%);
	width: 160px;
	height: 160px;
	border: 18px solid var(--color-yellow-bright);
	box-sizing: border-box;
	z-index: 1;
}
@media (min-width: 576px) {
	.bannerAccent {
		bottom: -100px;
		width: 200px;
		height: 200px;
	}
}
@media (min-width: 992px) {
	.bannerAccent {
		bottom: -120px;
		width: 260px;
		height: 260px;
		border-width: 20px;
	}
}

/* About Us variant — sits ON the photo, inset from its right edge, rather than straddling the
   bottom edge and centring the way the What We Do square does.

   WHY THIS EXISTS AT ALL: this square used to live in the page body, absolutely positioned
   ~970px upwards out of the "Who you'll actually work with" section in order to reach the photo.
   Its position therefore depended on the combined height of the banner title, the photo and the
   spacing between them — so a translated title wrapping to one more line would move it, and each
   language would have needed its own offset. As a child of .bannerPhoto it's measured from the
   photo itself and cannot drift, in any language.

   BOTH BREAKPOINTS. Mobile used to keep its own square in the page body, and that turned out to
   be the same bug in miniature: the body section is pulled up under the photo, so the square (and
   the heading with it) landed on top of the image. Measured live at 375px, the section's <h2> sat
   41px inside the photo and covered the photo credit completely. Anchoring the square here and
   removing the pull fixes both. The mobile values reproduce the old rendering exactly — 120px
   square, 10px border, straddling the photo's bottom-right corner.

   `top` (desktop) / `bottom` (mobile) is the one value to tune if the square sits too high or low.
   Desktop measures DOWN from the photo's top edge, mobile UP from the bottom. Anchoring from the top rather than the bottom is deliberate: the photo's own
   height is fixed, but a photo credit sits below it (About Us has one), so a bottom-anchored
   offset would shift if that caption ever wrapped to two lines.

   Three of these declarations exist purely to undo the base .bannerAccent rule, which centres the
   square horizontally and hangs it off the photo's bottom edge: `left: auto` and `transform: none`
   cancel the centring, and `bottom: auto` cancels the bottom anchoring so `top` can take over.
   Without that last one the element would have both offsets set and `top` would lose. */
.bannerAccent--onPhoto {
	left: auto;
	transform: none;
	top: auto;
	bottom: -30px;
	right: -5px;
	width: 120px;
	height: 120px;
	border-width: 10px;
}
@media (min-width: 992px) {
	.bannerAccent--onPhoto {
		bottom: auto;
		top: 110px;
		right: 130px;
		width: 260px;
		height: 260px;
		border-width: 20px;
	}
}

/* Paragraph copy inside content blocks. Replaces the old convention of writing
   `<p class="bigger">` in the desktop copy and a plain `<p>` in the mobile one.
   Mobile value is the site's 19px base; desktop steps up to what `.bigger` did. */
.bodyText {
	font-size: 1em;
	line-height: 30px;
}
@media (min-width: 992px) {
	.bodyText {
		font-size: 1.2em;
		line-height: 1.6em;
	}
}

/* Section headings (<h2>). `padding-top: 0` is baked in because the base h2 rule
   carries `padding-top: 1.2em`, which every inline style was overriding by hand.
   Use the --secondary modifier for closing/centered headings — see the two
   heading tiers documented in :root above. */
.sectionHeading {
	font-size: var(--font-size-heading-mobile);
	padding-top: 0;
}
@media (min-width: 992px) {
	.sectionHeading {
		font-size: var(--font-size-heading-desktop);
	}
}
@media (min-width: 992px) {
	.sectionHeading.sectionHeading--secondary {
		font-size: var(--font-size-heading-secondary-desktop);
	}
}
