/*
 Theme Name:   Bricks Child Theme
 Theme URI:    https://bricksbuilder.io/
 Description:  Use this child theme to extend Bricks.
 Author:       Bricks
 Author URI:   https://bricksbuilder.io/
 Template:     bricks
 Version:      1.1
 Text Domain:  bricks
*/
/* --------------------------------------------------------------------------
 * Footer menu: hide dropdown sub-menus (SEO/PPC, sectors, etc.).
 * The "Main Menu" is shared with the header; hiding is scoped to the footer
 * nav (#brxe-vytbfn) so the header keeps its dropdowns. The absolutely-
 * positioned sub-menus were extending the page below the footer (blank space).
 * ------------------------------------------------------------------------- */
#brxe-vytbfn .sub-menu { display: none !important; }
#brxe-vytbfn .brx-submenu-toggle > button { display: none !important; }

/* --------------------------------------------------------------------------
 * FAQ accordion (Bricks accordion element) — dividers + +/- toggle marker.
 * ------------------------------------------------------------------------- */
.brxe-accordion .accordion-item { border-bottom: 1px solid #e0e0e0; }
.brxe-accordion .accordion-item:first-child { border-top: 1px solid #e0e0e0; }
.brxe-accordion .accordion-title-wrapper { position: relative; cursor: pointer; padding-right: 44px; }
.brxe-accordion .accordion-title-wrapper::after {
	content: "+"; position: absolute; right: 6px; top: 50%;
	transform: translateY(-50%); color: var(--ue-blue);
	font-size: 28px; line-height: 1; font-weight: 300; transition: transform .2s ease;
}
.brxe-accordion .accordion-title-wrapper[aria-expanded="true"]::after { content: "\2212"; }

/* --------------------------------------------------------------------------
 * CTA buttons & arrows (QA 16/07/26).
 * Default = stroke outline; hover = fills to the full colour state. The hover
 * colours are set per element in Bricks (each arrow fills with its own brand
 * colour); this only animates the transition so it doesn't snap.
 * ------------------------------------------------------------------------- */
.brxe-button.bricks-button,
.brxe-button.bricks-button i {
	transition: background-color .25s ease, color .25s ease, border-color .25s ease;
}

/* --------------------------------------------------------------------------
 * Numbered sections ("01 / 02 / 03…") — dotted vertical column separators,
 * per the supplied design. Applied to EVERY numbered grid site-wide, not just
 * Web Design. They all share the same responsive setup (3-or-2 cols desktop,
 * 2 cols <=767, 1 col <=478), so the "first card in row" reset follows suit.
 * ------------------------------------------------------------------------- */
#brxe-p8km1t > *,
#brxe-rdjvvn > *,
#brxe-fixdx1 > *,
#brxe-mto71m > *,
#brxe-2ccpca > *,
#brxe-r6d7cr > *,
#brxe-fnaojk > *,
#brxe-zntqfk > *,
#brxe-wdbvw5 > *,
#brxe-7ye02s > *,
#brxe-tckkga > *,
#brxe-y8djr6 > * {
	border-left: 2px dotted var(--ue-dark-blue);
	padding-left: var(--space-l);
}

/* first card in each row carries no separator */
#brxe-p8km1t > *:nth-child(3n + 1),
#brxe-rdjvvn > *:nth-child(3n + 1),
#brxe-fixdx1 > *:nth-child(3n + 1),
#brxe-mto71m > *:nth-child(3n + 1),
#brxe-2ccpca > *:nth-child(3n + 1),
#brxe-r6d7cr > *:nth-child(3n + 1),
#brxe-fnaojk > *:nth-child(3n + 1),
#brxe-zntqfk > *:nth-child(3n + 1),
#brxe-wdbvw5 > *:nth-child(3n + 1),
#brxe-7ye02s > *:nth-child(2n + 1),
#brxe-tckkga > *:nth-child(2n + 1),
#brxe-y8djr6 > *:nth-child(2n + 1) {
	border-left: 0;
	padding-left: 0;
}

/* 479-767px: the 3-column grids drop to 2 columns.
   Lower bound matters. These selectors carry a pseudo-class (#id > *:nth-
   child(3n+1)) so they outrank the plain "#id > *" reset in the <=478 block
   below, even though that block comes later — the every-third-item border
   survived into the single-column phone layout and showed as one indented
   item with a stray vertical line. Scoping to the range where two columns
   actually exist removes the conflict rather than fighting it. */
@media (min-width: 479px) and (max-width: 767px) {
	#brxe-p8km1t > *:nth-child(3n + 1),
	#brxe-rdjvvn > *:nth-child(3n + 1),
	#brxe-fixdx1 > *:nth-child(3n + 1),
	#brxe-mto71m > *:nth-child(3n + 1),
	#brxe-2ccpca > *:nth-child(3n + 1),
	#brxe-r6d7cr > *:nth-child(3n + 1),
	#brxe-fnaojk > *:nth-child(3n + 1),
	#brxe-zntqfk > *:nth-child(3n + 1),
	#brxe-wdbvw5 > *:nth-child(3n + 1) {
		border-left: 2px dotted var(--ue-dark-blue);
		padding-left: var(--space-l);
	}
	#brxe-p8km1t > *:nth-child(2n + 1),
	#brxe-rdjvvn > *:nth-child(2n + 1),
	#brxe-fixdx1 > *:nth-child(2n + 1),
	#brxe-mto71m > *:nth-child(2n + 1),
	#brxe-2ccpca > *:nth-child(2n + 1),
	#brxe-r6d7cr > *:nth-child(2n + 1),
	#brxe-fnaojk > *:nth-child(2n + 1),
	#brxe-zntqfk > *:nth-child(2n + 1),
	#brxe-wdbvw5 > *:nth-child(2n + 1) {
		border-left: 0;
		padding-left: 0;
	}
}

/* <=478px: single column — no separators anywhere */
@media (max-width: 478px) {
	#brxe-p8km1t > *,
	#brxe-rdjvvn > *,
	#brxe-fixdx1 > *,
	#brxe-mto71m > *,
	#brxe-2ccpca > *,
	#brxe-r6d7cr > *,
	#brxe-fnaojk > *,
	#brxe-zntqfk > *,
	#brxe-wdbvw5 > *,
	#brxe-7ye02s > *,
	#brxe-tckkga > *,
	#brxe-y8djr6 > * {
		border-left: 0;
		padding-left: 0;
	}
}

/* --------------------------------------------------------------------------
 * GSAP reveal animations — prevent the flash (FOUC).
 * Elements are hidden before JS runs, so they never paint visible and then
 * get snapped to opacity:0 by GSAP. Once the tweens exist the script adds
 * html.gsap-init, restoring the baseline to visible: GSAP's *inline* opacity
 * then drives the reveal (inline beats these rules), and content stays visible
 * after clearProps. The class is also added as a failsafe if GSAP never loads,
 * so content can never be permanently hidden.
 * ------------------------------------------------------------------------- */
.reveal-up,
.reveal-left,
.reveal-right { opacity: 0; }

html.gsap-init .reveal-up,
html.gsap-init .reveal-left,
html.gsap-init .reveal-right { opacity: 1; }

/* --------------------------------------------------------------------------
 * Header stacking vs the homepage rocket.
 *
 * The header's blue bar (#brxe-nuniwo) IS the blue at the top of the page —
 * the hero section starts *below* it (behind the header is just white body),
 * and the rocket is pulled up with a negative margin so it deliberately
 * overlaps that bar. So the bar must stay opaque (making it transparent puts
 * a white logo on white, e.g. /insights) AND must stay *below* the artwork,
 * or it slices the nose off the rocket.
 *
 * The only thing that must sit above the artwork is the menu toggle, or it
 * isn't clickable. Lift just that button: it's a leaf, so it can't trap
 * anything. Do NOT put z-index on #brx-header or an inner header container —
 * the mobile menu overlay lives inside them, and a new stacking context caps
 * its z-index:999 at the ancestor's level so it stops covering the page.
 * (The logo sits at x170-427, clear of the rocket at x775, so needs nothing.)
 * ------------------------------------------------------------------------- */
/* Must clear BOTH the hero artwork and the OPEN menu overlay (z-index:999):
 * this button *is* the close X once the menu is open, so at a lower z-index
 * the overlay paints over it and the X is washed out and unclickable. */
#brx-header .bricks-mobile-menu-toggle { z-index: 1000; } /* already position:relative */

/* --------------------------------------------------------------------------
 * Pull-quotes. A <blockquote> inherits the browser/theme default of
 * georgia / "Times New Roman" / serif, which nothing here overrides — so the
 * GEO pull-quote rendered as a serif in an otherwise all-Poppins site.
 * Keep the semantic tag, take the site font.
 * ------------------------------------------------------------------------- */
blockquote,
blockquote * { font-family: inherit; }

/* --------------------------------------------------------------------------
 * UE brand flare — paint-edged dark bands.
 *
 * The hero divider is a blue paint splat that drips down into the white below;
 * everywhere else the solid navy bands were hard rectangles. Reuse that exact
 * splat as a CSS mask so each navy band tears out of the page like brushed
 * paint instead of a printed block. Same asset, tinted navy via mask.
 *
 *  ::before  = ragged spray edge along the TOP  (mask flipped, drips point up)
 *  ::after   = paint drip edge along the BOTTOM (mask upright, drips point down
 *              — identical direction to the hero divider)
 *
 * TOP edge goes on every navy band (the section above is always light).
 * BOTTOM drip goes ONLY on the four mid-content callouts — the testimonials
 * component (.brxe-qtiyjq) can sit flush against the light-blue footer, so a
 * bottom drip there would fall on the footer heading.
 *
 * All bands are the same navy (#004269). Mask URL is root-relative so it
 * survives the staging -> live domain move.
 * ------------------------------------------------------------------------- */
.brxe-qtiyjq,
#brxe-cbwt4o, #brxe-4cptw9, #brxe-n80r4c, #brxe-alteod { position: relative; }

#brxe-cbwt4o::before, #brxe-4cptw9::before, #brxe-n80r4c::before, #brxe-alteod::before,
#brxe-cbwt4o::after,  #brxe-4cptw9::after,  #brxe-n80r4c::after,  #brxe-alteod::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  height: 68px;
  background: #004269;
  -webkit-mask-image: url("/wp-content/uploads/2026/04/Main-Homepage-Background-cropped-scaled.png");
          mask-image: url("/wp-content/uploads/2026/04/Main-Homepage-Background-cropped-scaled.png");
  -webkit-mask-size: 100% 100%;
          mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  pointer-events: none;
}

/* TOP spray edge — sits above the band, mask flipped so the drips point up */
#brxe-cbwt4o::before, #brxe-4cptw9::before, #brxe-n80r4c::before, #brxe-alteod::before {
  bottom: 100%;
  transform: scaleY(-1);
}

/* BOTTOM drip edge — sits below the band, mask upright (hero direction) */
#brxe-cbwt4o::after, #brxe-4cptw9::after, #brxe-n80r4c::after, #brxe-alteod::after {
  top: 100%;
}

/* --------------------------------------------------------------------------
 * Paint-edged bands, part 2 (outer spacing).
 *
 * The painted spray/drip edges sit OUTSIDE each band (~68px tall). With the
 * sections butting flush together they overlapped the neighbours — the image
 * above and the success stories below. Add outer margin so the splash lands
 * in clear space, not on top of the next section. Callouts drip top+bottom;
 * the testimonials band only sprays at the top, so margin its top only.
 * ------------------------------------------------------------------------- */
#brxe-cbwt4o, #brxe-4cptw9, #brxe-n80r4c, #brxe-alteod {
  margin-top: 90px !important;
  margin-bottom: 90px !important;
}
/* the edge is 1/6.115 of the width (its aspect), so reserve space in the same
 unit — a fixed px margin only clears it at one viewport size */
.brxe-qtiyjq { margin-top: 19% !important; }

/* --------------------------------------------------------------------------
 * Blockquote pull-quotes carried Bricks' default 4px grey left rule + 30px
 * indent — an inherited framework default (the element sets no border of its
 * own), not a design choice, same story as the serif font. Drop it so the
 * quote aligns with the overline and body copy.
 * ------------------------------------------------------------------------- */
blockquote {
  border-left: 0 !important;
  padding-left: 0 !important;
}

/* --------------------------------------------------------------------------
 * Mobile menu overlay — stop the horizontal jump when a submenu expands.
 *
 * At >=480px the overlay wrapper centres the menu list (align-items:center),
 * and the list is sized to its widest line. Collapsed, that's "Web Design &
 * Development" (~343px); expanding Social Media reveals "Organic Social Media
 * Management" (~372px), so the centred block grows ~29px wider and re-centres,
 * shifting every top-level item ~15px left.
 *
 * Reserve the widest state up front so the list width never changes on expand
 * — the centre point stays put. (Only applies where the list floats centred;
 * below 480px it's left-aligned and unaffected.)
 * ------------------------------------------------------------------------- */
@media (min-width: 480px) {
  .bricks-mobile-menu { min-width: 380px; }
}

/* --------------------------------------------------------------------------
 * Staggered item reveals (GSAP).
 *
 * A .reveal-stagger container fades its child items up one after another
 * (heading, text, button, icon) instead of the whole block moving as one.
 * Same anti-FOUC contract as .reveal-up: pre-hide the items in CSS, then the
 * GSAP init adds html.gsap-init to restore the visible baseline (a completed
 * tween's clearProps drops the inline opacity, so this baseline holds them
 * visible; the 3s failsafe + <noscript> cover a blocked/broken GSAP).
 * ------------------------------------------------------------------------- */
.reveal-stagger .brxe-heading,
.reveal-stagger .brxe-text,
.reveal-stagger .brxe-text-basic,
.reveal-stagger .brxe-button,
.reveal-stagger .brxe-image { opacity: 0; }

html.gsap-init .reveal-stagger .brxe-heading,
html.gsap-init .reveal-stagger .brxe-text,
html.gsap-init .reveal-stagger .brxe-text-basic,
html.gsap-init .reveal-stagger .brxe-button,
html.gsap-init .reveal-stagger .brxe-image { opacity: 1; }

/* Post byline in the single-post hero */
.ue-byline { color: var(--ue-white,#fff); font-size: 1.6rem; margin: 1.2rem 0 0; }
.ue-byline__link { color: var(--ue-white,#fff); text-decoration: underline; text-underline-offset: 3px; }
.ue-byline__link:hover { color: var(--ue-dark-blue,#004269); }
.ue-byline__role { opacity: .85; }

/* --------------------------------------------------------------------------
 * Free SEO audit widget band (GEO & AEO + SEO pages).
 * Copy left, widget right, on the dark blue. The element ids are the same on
 * both pages, so one rule covers them.
 * ------------------------------------------------------------------------- */
#brxe-uewsec {
	background: var(--ue-dark-blue, #004269);
	color: var(--ue-white, #fff);
}
#brxe-uewsec h1, #brxe-uewsec h2, #brxe-uewsec h3, #brxe-uewsec p {
	color: var(--ue-white, #fff);
}
#brxe-uewcon {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: clamp(2rem, 4vw, 5rem);
	align-items: center;
}
/* the iframe carries an inline max-width; let it fill its column */
#brxe-uewrgt .ue-audit-widget iframe { margin-inline: 0; }

@media (max-width: 991px) {
	#brxe-uewcon { grid-template-columns: 1fr; }
	#brxe-uewrgt .ue-audit-widget iframe { margin-inline: auto; }
}

/* --------------------------------------------------------------------------
 * Hero drip divider: the artwork is ~388px tall at desktop but its ink mass
 * ends around halfway, leaving a band of near-empty white (a few stray
 * droplets) between the hero and the first paragraph. Pull the following
 * content back up under the mass so the droplets sit alongside it rather
 * than reserving full height.
 *
 * A percentage margin resolves against the container width, so this scales
 * with the image (which is a fixed aspect ratio) instead of needing
 * per-breakpoint values.
 * ------------------------------------------------------------------------- */
/* !important because each template sets its own per-element margin on this
   image (-100px on one, none on another), which is why the gap ranged from
   15px to 136px across the site. One value, applied everywhere. */
/* The -8% here was tuned to the previous artwork, which was 3.7:1 with a large
   near-empty tail. The current drip art is 6.1:1 and its drips run almost to
   the bottom edge, so the same pull now drags text under the paint. Percentage
   margins resolve against WIDTH, so at 6.1:1 the image is ~16% of its own
   width: -2% pulls up about an eighth of the image, which closes the gap
   without touching the drips. */
.ue-splat { display: block; margin-bottom: -2% !important; }

/* Audit band — the left column was far too sparse next to a tall widget.
   Big headline, icon and supporting points to balance it. (10px root: 1rem = 10px.) */
#brxe-uewicon img { width: clamp(64px, 7vw, 96px); height: auto; }
#brxe-uewicon { margin-bottom: clamp(1.5rem, 2vw, 2.4rem); }

#brxe-uewhead {
	font-size: clamp(3.8rem, 5.2vw, 6.4rem) !important;
	line-height: 1.05;
	font-weight: 800;
	margin: 0 0 1.6rem;
}
.ue-audit-lead {
	font-size: clamp(1.8rem, 2vw, 2.2rem);
	line-height: 1.5;
	margin: 0 0 2rem;
	max-width: 46ch;
}
.ue-audit-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 1.2rem;
	font-size: clamp(1.6rem, 1.7vw, 1.8rem);
}
.ue-audit-list li {
	position: relative;
	padding-left: 3.2rem;
	line-height: 1.45;
}
/* tick marks, drawn rather than an icon font so nothing extra loads */
.ue-audit-list li::before {
	content: "";
	position: absolute;
	left: 0;
	top: .35em;
	width: 1.8rem;
	height: .9rem;
	border-left: 3px solid var(--ue-blue, #3faff0);
	border-bottom: 3px solid var(--ue-blue, #3faff0);
	transform: rotate(-45deg);
}

/* The UE icons are black line art drawn for the light blue hero; on the navy
   audit band they barely read. Flip to white. */
#brxe-uewicon { filter: brightness(0) invert(1); }


/* --------------------------------------------------------------------------
 * Testimonials band edge.
 *
 * This previously shared the callouts' masked edge, which forces the artwork
 * into a fixed 68px strip (mask-size: 100% 100%). The drip art is roughly 6:1,
 * so at full width it wants ~236px — squeezing it into 68px compressed the
 * spray about 3.5x vertically and made it look messy.
 *
 * Use the real dark blue splat at its own aspect ratio instead: no distortion,
 * and it matches the drip divider used under the page heroes. Flipped so the
 * solid edge meets the band and the spray reaches up into the section above.
 * ------------------------------------------------------------------------- */
.brxe-qtiyjq { position: relative; }
.brxe-qtiyjq::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  /* Overlap the band by 2px. The artwork's top pixel row is only ~95% opaque
     (alpha 242 vs 255 below it) and, once flipped, that row lands exactly on
     the junction — which with fractional layout positions showed as a hairline
     white line above the testimonials at some zoom levels. Overlapping removes
     the seam entirely rather than relying on sub-pixel rounding. */
  bottom: calc(100% - 2px);
  aspect-ratio: 3840 / 628;
  background-image: url("/wp-content/uploads/2026/07/Dark-Blue-Splat.png");
  background-size: 100% 100%;
  background-repeat: no-repeat;
  transform: scaleY(-1);
  pointer-events: none;
}

/* --------------------------------------------------------------------------
 * The GSAP reveals park .reveal-left / .reveal-right elements 100px off-axis
 * until their scroll trigger fires. Where one of those sits near the right
 * edge (homepage), that offset made the document 100px wider than the
 * viewport — a horizontal scrollbar on an otherwise fixed-width layout.
 *
 * Clip it: nothing on this site scrolls sideways by design. `clip` rather
 * than `hidden` so it does not become a scroll container and break sticky.
 * ------------------------------------------------------------------------- */
html { overflow-x: hidden; }
@supports (overflow: clip) {
  html { overflow-x: clip; }
}

/* --------------------------------------------------------------------------
 * Testimonial client logo splat.
 *
 * Blue-Splash.png is one splat, but its lower drip area is only ~59% opaque
 * (mean alpha 150 vs 235 in the solid mass). Drawn for white backgrounds,
 * where that reads as a lighter wash. On the navy testimonials band the dark
 * navy shows through instead, so the translucent half renders darker and
 * reads as a *second* splat sitting under the first.
 *
 * Compound the artwork over itself so the translucent areas approach opaque.
 * Scoped to the navy band: on the Insights cards (white background) the
 * original translucency is correct and is left alone.
 *
 * Proper fix is a uniformly opaque version of the asset — worth asking Ben
 * for alongside the coloured splats.
 * ------------------------------------------------------------------------- */
.brxe-qtiyjq .brxe-dkuend {
  background-image:
    url("/wp-content/uploads/2026/04/Blue-Splash.png"),
    url("/wp-content/uploads/2026/04/Blue-Splash.png"),
    url("/wp-content/uploads/2026/04/Blue-Splash.png");
  background-size: contain, contain, contain;
  background-position: center, center, center;
  background-repeat: no-repeat, no-repeat, no-repeat;
}

/* ==========================================================================
   Service colour heroes
   --------------------------------------------------------------------------
   Each service page takes its own colour across the header bar and hero, and
   the paint-drip divider beneath is served in the same colour by the PHP
   filter (see functions.php: ue_splat_variant_for). Colouring the drip alone
   left a hard blue-to-colour edge that read as a separate stripe.

   Driven off the page-id body class so the whole treatment is one rule per
   colour rather than per-element styling on each page — add a page id to a
   line here and to the map in functions.php and it picks the colour up.

   NOTE ON CONTRAST: white hero text passes AA on pink (4.85:1) but not on
   orange (2.39:1) or green (2.16:1), both of which are below the 4.5:1
   minimum. Flagged to the team; proceeding on the designers' decision. If it
   is revisited, switching those two to var(--ue-dark-blue) text clears AA
   comfortably without changing the brand colours.
   ========================================================================== */

/* pink — SEO (446), PPC (448) */
body.page-id-446 #brxe-gsfcf5, body.page-id-446 #brxe-nuniwo,
body.page-id-448 #brxe-gsfcf5, body.page-id-448 #brxe-nuniwo {
	background-color: var(--ue-pink);
}

/* orange — Social Media Marketing (87), Organic (452), Paid (454) */
body.page-id-87 #brxe-gsfcf5,  body.page-id-87 #brxe-nuniwo,
body.page-id-452 #brxe-gsfcf5, body.page-id-452 #brxe-nuniwo,
body.page-id-454 #brxe-gsfcf5, body.page-id-454 #brxe-nuniwo {
	background-color: var(--ue-orange);
}

/* green — Content Marketing (450) */
body.page-id-450 #brxe-gsfcf5, body.page-id-450 #brxe-nuniwo {
	background-color: var(--ue-green);
}

/* Kristian's widget copy adds an intro paragraph above the ticks; give it room. */
#brxe-uewtext p:not(.ue-audit-lead) { margin-bottom: 2rem; }

/* ==========================================================================
   Purposeful interaction
   --------------------------------------------------------------------------
   Felt rather than watched: the arrow leans in the direction it will take you,
   and a whole service card responds rather than just the button, so the card
   reads as one target. Transform and colour only — nothing that reflows —
   and all of it is dropped for reduced-motion users.
   ========================================================================== */
@media (prefers-reduced-motion: no-preference) {

  /* Arrow buttons: nudge along the diagonal the arrow already points. The
     rotation lives on the button itself, so the icon is nudged instead. */
  .brxe-button.bricks-button i {
    transition: transform .28s cubic-bezier(.2,.7,.3,1),
                background-color .25s ease, color .25s ease;
  }
  .brxe-button.bricks-button:hover i { transform: translate(3px, -3px); }

  /* Service cards: the arrow responds when any part of the card is hovered,
     so the whole block behaves as one control. */
  #brxe-ournwy, #brxe-utsjhk, #brxe-toaenq,
  #brxe-ihznmo, #brxe-vwnyow { transition: transform .3s cubic-bezier(.2,.7,.3,1); }
  #brxe-ournwy:hover, #brxe-utsjhk:hover, #brxe-toaenq:hover,
  #brxe-ihznmo:hover, #brxe-vwnyow:hover { transform: translateY(-4px); }

  #brxe-ournwy:hover .brxe-button i,
  #brxe-utsjhk:hover .brxe-button i,
  #brxe-toaenq:hover .brxe-button i,
  #brxe-ihznmo:hover .brxe-button i,
  #brxe-vwnyow:hover .brxe-button i { transform: translate(3px, -3px); }

  /* Success story cards use their own arrow classes. */
  .brxe-sscs04, .brxe-sscs0b { transition: transform .3s cubic-bezier(.2,.7,.3,1), background-color .25s ease, color .25s ease; }
  .brxe-sscs00:hover .brxe-sscs04, .brxe-sscs07:hover .brxe-sscs0b { transform: rotateZ(45deg) translate(3px, 3px); }
}

/* ==========================================================================
   Mobile layout fixes (Natasha, 26 Sep: "doesn't respond particularly well",
   stats "hang off the edge")

   Two separate root causes, both classic and both fixed generically here
   rather than per element, so new sections inherit the fix.
   ========================================================================== */
@media (max-width: 767px) {

	/* 1. Grid blowout.
	   A `1fr` track is `minmax(auto, 1fr)`, and that `auto` floor is the
	   item's min-content width — so a long stat caption pushes the track
	   wider than the screen and the whole grid overflows. min-width:0 lets
	   the item shrink, which is what `1fr` was meant to do. This changes no
	   column counts, so every authored mobile layout is preserved. */
	.brx-grid > * { min-width: 0; }

	/* 2. Column-flex wrapping.
	   The homepage hero block is `flex-direction: column` with `flex-wrap:
	   wrap`. When its content exceeds the available height it wraps into a
	   SECOND COLUMN, which makes the block wider rather than taller — it
	   settled at 495px inside a 335px container.
	   Scoped to the hero deliberately: applying nowrap to every block also
	   catches ROW flex containers (the footer link rows, the header), where
	   wrapping is exactly what should happen — that broke all 16 pages. */
	#brxe-pfvnxn { flex-wrap: nowrap; }

	/* 3. The homepage rocket.
	   Set to a fixed 495px, which is both wider than a phone (335px of
	   usable width) and larger than the artwork's natural 374px, so it was
	   upscaled and then clipped by the overflow guard on <html>. Cap it to
	   the column and never beyond its own resolution. The desktop negative
	   margin that overlaps the header bar is untouched. */
	#brxe-afyhhl { width: 100% !important; max-width: 374px !important; height: auto; margin-inline: auto; }
}


/* --------------------------------------------------------------------------
 * The faint white line along the top of the paint-drip dividers.
 *
 * Not a layout gap — measured zero at every breakpoint. It is the artwork:
 * Ben's four coloured variants (green/orange/pink/light-blue) carry an alpha
 * of 247/255 on their top pixel row, where the original blue splat is a full
 * 255. Three percent of the white page bleeding through a saturated edge
 * reads as a hairline. Pulling the divider up two pixels puts the hero band
 * behind that row instead of the page background, so there is nothing white
 * left to show through. The band is always the same colour as the drip, so
 * the overlap is invisible.
 *
 * The real fix is to re-export the variants with a fully opaque top row; this
 * holds until then and costs nothing if they are replaced.
 * ------------------------------------------------------------------------- */
img.ue-splat, .tm-splat, .ty-splat { margin-top: -2px !important; }


/* --------------------------------------------------------------------------
 * Page hero icon: never wider than its column.
 *
 * The icon is an <img> with a hard-coded width (350px). Between 479px and
 * 767px the hero grid gives its column ~133px, so the image punched roughly
 * 200px past the right edge of the screen on every service and sector page;
 * at 360px it overflowed by 10px. A fixed pixel width on an image inside a
 * fluid grid is the bug — cap it to the column and let it scale.
 * ------------------------------------------------------------------------- */
@media (max-width: 1023px) {
	.brxe-image { max-width: 100%; height: auto; }
}


/* --------------------------------------------------------------------------
 * Tablet band (768-1023px).
 *
 * The phone rules above stop at 767, but the homepage hero rocket is a fixed
 * 495px and the hero column is narrower than that until roughly 900px — so
 * iPad portrait (768) pushed it ~104px off the right edge. Same fix, applied
 * up to the width where the fixed size genuinely fits.
 *
 * The long service-card titles ("Web Design & Development") are a single
 * unbreakable run at very narrow widths; allowing a break stops them poking
 * out of their card on 320px screens.
 * ------------------------------------------------------------------------- */
@media (max-width: 1023px) {
	#brxe-afyhhl { width: 100% !important; max-width: 374px !important; height: auto; margin-inline: auto; }
	#brxe-pfvnxn, #brxe-xjgftt { flex-wrap: nowrap; max-width: 100%; }
}

@media (max-width: 374px) {
	.brxe-heading, .brxe-heading a, .brxe-text-basic { overflow-wrap: break-word; }
}


/* --------------------------------------------------------------------------
 * Long unbreakable strings (email addresses, URLs) set the minimum width of
 * their column, so "info@urbanelement.com" in the contact block pushed its
 * grid cell past the viewport on tablets. Let them break.
 * ------------------------------------------------------------------------- */
a[href^="mailto:"], a[href^="tel:"], a.email, .brxe-text a[href^="http"] {
	overflow-wrap: anywhere;
}

/* Hand-drawn illustrations as inline SVG (functions.php, illustrations/).
   Size comes from the image's width/height and inline aspect-ratio; overflow
   stays visible so the settling wobble isn't clipped. */
svg.ue-art { display: block; height: auto; overflow: visible; }
html.ue-art-motion svg.ue-art:not(.ue-art-ready) > g { opacity: 0; }
