/*
Theme Name:   Carroll Transportation Group
Theme URI:    https://carroll-trucking.com
Description:  Divi child theme for Carroll Transportation Group. Carries the complete design
              system, the TikTok Sans variable font and the motion script, so nothing has to be
              pasted into an admin box or uploaded to an exact path by hand.
Author:       Primm Advertising
Template:     Divi
Version:      1.2.1
Text Domain:  carroll-child
*/


/* ==========================================================================
   CARROLL TRANSPORTATION GROUP — homepage
   Built to numbers measured off https://carroll.primm-advertising-demo.com
   Container 1280 / 32px pad -> 1216 content. Navy #061C31 · Red #D02C2A.
   ========================================================================== */
.crl{
  --navy:#061C31; --red:#D02C2A; --c1:#FBF8F2; --c2:#FAF6EE; --c3:#EFE7D9;
  --line:#E3DDD3; --muted:#515F6E;
}
.crl, .crl p, .crl li, .crl span, .crl a, .crl input, .crl select, .crl textarea, .crl button{
  font-family:'Inter',system-ui,-apple-system,'Segoe UI',sans-serif;
  /* the source runs Inter with these stylistic sets — without them body copy is a hair wider and
     wraps a word early on almost every paragraph */
  font-feature-settings:'cv11','ss01';
}
/* Divi's et_pb_text emits CSS for header_2_* .. header_6_* but NOT for header_* (H1), so an H1
   styled through the module fields renders at the theme default — 30px dark grey on navy. Drive
   the H1 from here instead; every page uses the same measured H1. */
.crl .crl-h1 h1{ font-weight:700; font-size:63.36px; line-height:66.53px;
  letter-spacing:-0.6336px; color:var(--c2); }
.crl-split .crl-h1 h1, .crl-reach .crl-h1 h1{ color:var(--navy); }

.crl h1,.crl h2,.crl h3,.crl h4,.crl blockquote,
.crl .crl-statn,.crl .crl-coord{
  font-family:'TikTok Sans','Inter',system-ui,sans-serif;
  /* TikTok Sans is variable (wdth 75..125). The source runs headings CONDENSED at 90% —
     without this every headline is ~11% wider and breaks on different words. */
  font-stretch:90%;
}
/* the signature move — a red italic phrase inside an upright headline */
.crl h1 *, .crl h2 *, .crl h3 *, .crl h4 *, .crl blockquote *{ font-family:inherit; }
/* the accent is the COLOUR; the italic belongs only to the <em> form. The source also ships a
   plain <span class="text-ember"> — upright and red — and forcing italic on it was wrong. */
.crl .crl-em{ color:var(--red); font-weight:inherit; display:inline-block; }
.crl em.crl-em{ font-style:italic; }
.crl p{ padding-bottom:0 !important; margin:0; }
.crl .et_pb_text_inner > p:last-child{ margin-bottom:0; }
.crl a{ text-decoration:none; }

/* Divi's own @font-face for an uploaded font carries no descriptors, so its local copy only
   ever satisfies weight 400 at width 100% — every 700-weight, 90%-width headline would fall
   back to the Google copy. Declare the variable ranges ourselves so the hosted file is fully
   usable on its own, and the site keeps its type if Google Fonts is ever unreachable. */
@font-face{ font-family:'TikTok Sans'; font-style:normal; font-weight:400 900;
  font-stretch:75% 125%; font-display:swap;
  src:url(assets/fonts/carroll-tiktok-sans-variable.woff2) format('woff2'); }

/* ---- shared bits --------------------------------------------------------- */
.crl .crl-eyebrow{ display:flex; align-items:center; gap:16px; }
.crl .crl-eyebrow-t{ font-size:12px; font-weight:600; letter-spacing:2.16px;
  text-transform:uppercase; color:var(--red); line-height:18px; }
.crl .crl-eyebrow-c{ justify-content:center; }
.crl .crl-rule{ display:block; width:48px; height:1px; background:var(--red); flex:0 0 48px; }
.crl .crl-arrow{ display:inline-block; margin-left:8px; }
.crl .crl-redlink{ color:var(--red); font-size:14px; font-weight:600; letter-spacing:1.4px;
  text-transform:uppercase; display:inline-flex; align-items:center; }
.crl .crl-center{ text-align:center; }
.crl .crl-mb20{ margin-bottom:20px !important; }
.crl .crl-mb24{ margin-bottom:24px !important; }
.crl .crl-mb32{ margin-bottom:32px !important; }
.crl .crl-mb40{ margin-bottom:40px !important; }
.crl .et_pb_module{ margin-bottom:0; }

/* ==========================================================================
   TYPE + BUTTON SYSTEM — defined ONCE here, reused by all 23 pages.
   Divi's per-module generated CSS proved unreliable for these (it emits nothing for header_*
   on a text module, and dropped several text/button modules on the homepage outright), and
   23 hand-tuned copies is exactly the inconsistency this pass is fixing. One definition, minor
   tweaks by class.
   ========================================================================== */
/* Headings. Divi's per-module generation drops modules unpredictably, so every recurring type
   role is defined here once and reused across all 23 pages. Colour follows the section, which is
   the only thing that actually varies. */
.crl .crl-h2 h2{ font-weight:700; font-size:48px; line-height:51.84px; letter-spacing:-0.48px;
  color:var(--navy); }
.crl-hero .crl-h2 h2, .crl-reel .crl-h2 h2, .crl-cta .crl-h2 h2{ color:var(--c2); }
.crl-panel .crl-p-body h3{ font-weight:500; font-size:60px; line-height:63px;
  letter-spacing:-0.6px; color:var(--c2); max-width:696px; }
.crl-panel .crl-p-body p{ font-size:18px; line-height:29.25px; color:var(--c2); max-width:576px; }
.crl .crl-2up-body h3{ font-weight:700; font-size:31.68px; line-height:36.43px;
  letter-spacing:-0.3168px; color:var(--c2); }
.crl .crl-reel-lede p{ font-size:16px; line-height:26px; color:var(--c2); }

.crl .crl-lede p{ font-size:18px; line-height:29.25px; color:var(--c2); }
.crl .crl-lede-sm p{ font-size:16px; line-height:26px; color:var(--c2); }
.crl-split .crl-lede p, .crl-reach .crl-lede p, .crl-reach .crl-lede-sm p,
.crl-svc-intro .crl-lede p{ color:var(--navy); }

.crl .crl-btn.et_pb_button,
.crl .crl-btn.et_pb_button:hover{ background-color:var(--red); background-image:none;
  color:#FBF8F1; border:0; border-radius:0; padding:14px 24px !important;
  font-size:14px; font-weight:600; letter-spacing:.56px; text-transform:uppercase; }
.crl .crl-btn-ghost.et_pb_button,
.crl .crl-btn-ghost.et_pb_button:hover{ background-color:transparent; color:var(--c2);
  border:1px solid #FFFFFF; }
/* The arrow itself comes from Divi's native button_icon — never re-declare `content`, two
   :after rules render two glyphs. Only its POSITION needs correcting: Divi absolutely-positions
   the icon and reserves room with padding-right, which our fixed padding removed, so it spilled
   outside the button. Make it inline instead. */
.crl .crl-btn.et_pb_button:after{ position:static !important; margin-left:0 !important;
  opacity:1 !important; line-height:23px !important; }
.crl-split .crl-btn-ghost.et_pb_button{ color:var(--navy); border-color:var(--navy); }

/* Divi buttons. module_class lands on the <a>, but the WRAPPER is display:block — two buttons
   stack instead of sitting side by side. :has() puts the wrapper inline. */
/* Divi scopes its button CSS through `#et-boc`, an ID — no class selector of ours can outrank
   it, so a plain `line-height:23px` here lost silently to Divi's 1.7em (23.8px) on every button
   on all 23 pages. The source measures 21px; !important is the only thing that reaches it. */
.crl .crl-btn.et_pb_button{ line-height:21px !important; }
/* Divi's icon sits tight against the label; the source leaves ~14px, which is 24px of button
   width across the pair */
.crl .crl-btn.et_pb_button:after{ margin-left:14px !important; font-size:20px !important;
  line-height:23px !important; }

/* ==========================================================================
   MOTION — measured off the source, not invented.
   reveal  : opacity 0->1 + translate/scale over .9s cubic-bezier(.22,1,.36,1)
   accent  : the red italic phrases slide + skew in over .7s
   scanline: 1px red sweep down the hero, 6s
   ========================================================================== */
/* module_class emits a CLASS, so the reveal hooks are classes — which also means they stay
   editable in the Visual Builder like any other module class */
.crl .crl-rev, .crl.crl-rev{ opacity:0; will-change:opacity,transform;
  transition:opacity .9s cubic-bezier(.22,1,.36,1), transform .9s cubic-bezier(.22,1,.36,1); }
.crl .crl-rev-up, .crl.crl-rev-up{ transform:translateY(40px); }
.crl .crl-rev-left, .crl.crl-rev-left{ transform:translateX(-40px); }
.crl .crl-rev-right, .crl.crl-rev-right{ transform:translateX(40px); }
.crl .crl-rev-zoom, .crl.crl-rev-zoom{ transform:scale(.94); }
.crl .crl-rev.is-in, .crl.crl-rev.is-in{ opacity:1; transform:none; }

.crl .crl-em{ transition:opacity .7s cubic-bezier(.2,.7,.2,1),
  transform .7s cubic-bezier(.2,.7,.2,1); }
.crl .crl-rev .crl-em{ opacity:0; transform:matrix(1,0,-0.140541,1,-28.8,0); }
.crl .crl-rev.is-in .crl-em{ opacity:1; transform:none; }

@keyframes crl-fade-up{ from{ opacity:0; transform:translateY(28px); } to{ opacity:1; transform:none; } }
.crl .crl-fade-up{ animation:crl-fade-up .8s ease-out both; }
.crl .crl-fade-up-2{ animation:crl-fade-up .9s ease-out .12s both; }
.crl .crl-fade-up-3{ animation:crl-fade-up .9s ease-out .24s both; }
.crl .crl-fade-up-4{ animation:crl-fade-up .9s ease-out .36s both; }

@keyframes crl-scanline{ 0%{ transform:translateY(0); opacity:0; }
  8%{ opacity:.55; } 92%{ opacity:.55; } 100%{ transform:translateY(920px); opacity:0; } }
.crl-hero .crl-scan{ position:absolute; inset-inline:0; top:0; height:1px; z-index:1;
  pointer-events:none;
  background:linear-gradient(to right,transparent,rgba(208,44,42,.6),transparent);
  animation:crl-scanline 6s ease-in-out infinite; }

/* Service-panel photo settles from scale 1.08 -> 1 over 1.4s, matching the source's
   `scale-110 transition-transform duration-[1400ms]`. The section background is the photo, so the
   scale is done with background-size. For every one of these images `100% auto` IS the cover size
   (all are taller-than-box once width-fitted), so the end state is pixel-identical to `cover`. */
.crl-panel{ background-size:108% auto !important;
  transition:background-size 1.4s cubic-bezier(0,0,.2,1),
             opacity .9s cubic-bezier(.22,1,.36,1),
             transform .9s cubic-bezier(.22,1,.36,1) !important; }
.crl-panel.is-in{ background-size:100% auto !important; }

@media (prefers-reduced-motion:reduce){
  .crl .crl-rev, .crl.crl-rev{ opacity:1 !important; transform:none !important; transition:none !important; }
  .crl .crl-rev .crl-em{ opacity:1 !important; transform:none !important; }
  .crl .crl-fade-up, .crl .crl-fade-up-2, .crl .crl-fade-up-3, .crl .crl-fade-up-4{ animation:none; }
  .crl-hero .crl-scan{ animation:none; opacity:0; }
}
.crl .et_pb_button_module_wrapper:has(.crl-btn-inline){ display:inline-block; margin-right:16px;
  vertical-align:top; }
.crl .et_pb_button_module_wrapper:has(.crl-btn-inline):last-of-type{ margin-right:0; }
/* measured at 390: the source's button row is `flex-wrap:wrap` with a 16px gap, so the pair
   STACKS at its natural width. Side by side on a 390 screen squeezed "Request a Quote" onto two
   lines and pushed the ghost button off the edge. */
@media (max-width:980px){
  .crl .et_pb_button_module_wrapper:has(.crl-btn-inline){ display:block; margin-right:0;
    margin-bottom:16px; }
  .crl .et_pb_button_module_wrapper:has(.crl-btn-inline):last-of-type{ margin-bottom:0; }
  .crl .crl-btn-inline.et_pb_button{ display:inline-flex; }
}

/* Grid helper: turn a Divi row into a real CSS grid (Divi 4 columns cannot express
   176px|1fr|auto, 7/5 at a 64px gap, or 478/268/162/162).
   Divi's .et_pb_row clearfix ::before/::after become GRID ITEMS and silently add a whole extra
   row — every gridded row must kill them. */
.crl .et_pb_row{ margin-top:0 !important; margin-bottom:0 !important; }
.crl .crl-grid::before, .crl .crl-grid::after{ display:none !important; }
.crl .crl-grid > .et_pb_column{ width:auto !important; float:none !important; margin:0 !important; }

/* the webfont <link> module renders nothing */
.crl .crl-fonts{ display:none !important; }

/* ---- 1. header ----------------------------------------------------------- */
/* Sticky is deliberate and confirmed with the client (2026-08-12): "static" meant always
   visible, not un-pinned. The whole strip travels, so the phone number and the quote CTA are
   reachable from anywhere on the page. --crl-hdr-h is the strip's real height and is the only
   place it is written down — the mobile panel measures its own max-height from it.

   The stickiness itself is DIVI'S OWN `sticky_position="top"` on the section, not CSS here.
   This used to say `position:sticky !important` and it never once worked: in a Theme Builder
   header the layout's wrapper (.et_builder_inner_content) is exactly as tall as the header, and
   a sticky element can only stick INSIDE its parent's box — so it had zero distance to travel
   and left with the page at every viewport. Nothing errored; `getComputedStyle` cheerfully
   reported "sticky" the whole time. Divi's native option positions against the window instead,
   survives the wrapper, AND shows up as a real toggle in the Visual Builder, so the client can
   change it without touching code. Do not re-add a `position` here — an !important would
   override the fixed positioning Divi applies while stuck and silently break it again.
   `position:relative` is the un-stuck base only, so the mobile panel has something to anchor
   to; Divi overrides it when the header pins. */
.crl-header{ --crl-hdr-h:118px; position:relative; z-index:500;
  -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
  border-bottom:1px solid rgba(227,221,211,.6); }
/* ---- utility strip: phone, email, quote CTA -------------------------------- */
/* The CTA moving OUT of the main row is what pays for the ninth nav item — the main row is now
   two columns, not three, so the nav gets every pixel between the logo and the right edge.
   .crl-util is capped at 1216 (1280 row minus its 32px padding either side) so its right edge
   lands exactly on the nav's, not 64px outside it. */
.crl-header .crl-util-row.et_pb_row{ background:var(--navy);
  width:100% !important; max-width:none !important; }
.crl-header .crl-util{ display:flex; align-items:center; justify-content:flex-end; gap:20px;
  height:37px; max-width:1216px; margin:0 auto; }
.crl-header .crl-util p{ display:contents; }   /* wpautop makes each anchor its own paragraph */
.crl-header .crl-util-l{ display:flex; align-items:center; gap:7px; text-decoration:none;
  font-size:13px; line-height:18px; color:rgba(250,246,238,.92); white-space:nowrap; }
.crl-header .crl-util-l:hover{ color:#FFF; }
.crl-header .crl-util-ic{ flex:0 0 13px; opacity:.75; }
.crl-header .crl-util-sep{ width:1px; height:14px; flex:0 0 1px;
  background:rgba(250,246,238,.22); }
.crl-header .crl-util-cta{ display:flex; align-items:center; gap:7px; text-decoration:none;
  background:var(--red); color:#FBF8F1; font-size:11.5px; font-weight:600; letter-spacing:.48px;
  text-transform:uppercase; line-height:18px; padding:7px 14px; white-space:nowrap; }
.crl-header .crl-util-cta:hover{ color:#FBF8F1; opacity:.92; }
.crl-header .crl-util-cta svg{ flex:0 0 14px; }
.crl-header .crl-hdr-row{ display:grid; grid-template-columns:auto 1fr; align-items:center;
  gap:24px; height:80px; }
.crl-header .crl-logo{ margin:0; }
/* The animated logo, measured off the source: a 150x44 stage clipping a truck that drives
   across on a 7s loop and WIPES the wordmark into view behind it. `overflow:hidden` on the
   stage is what makes the truck enter and leave rather than float over the nav.
   The stage is 150 at EVERY width — it was built at 220, and those extra 70px are dead space
   the truck visibly drives through beside a 118.8px wordmark. Measure the box, not the art. */
.crl-header .crl-logo-stage{ display:block; position:relative; width:150px; height:44px;
  overflow:hidden; }
.crl-header .crl-logo-reveal{ position:absolute; inset:0; display:flex; align-items:center;
  z-index:1; clip-path:inset(0 100% 0 0); animation:crl-logo-reveal 7s linear infinite; }
.crl-header .crl-logo-reveal img{ width:118.8px; height:36px; object-fit:contain; display:block; }
.crl-header .crl-logo-truck{ position:absolute; top:50%; left:0; height:26px; width:auto;
  z-index:2; pointer-events:none; transform:translate(-100%,-50%);
  filter:drop-shadow(0 1px 1px rgba(0,0,0,.15));
  animation:crl-logo-truck 7s linear infinite; }
@keyframes crl-logo-truck{ 0%{ left:0%; } 50%{ left:200%; } 100%{ left:200%; } }
@keyframes crl-logo-reveal{ 0%,8%{ clip-path:inset(0 100% 0 0); } 45%,100%{ clip-path:inset(0); } }
/* a looping animation behind a wordmark is exactly what reduced-motion is for */
@media (prefers-reduced-motion:reduce){
  .crl-header .crl-logo-reveal{ animation:none; clip-path:none; }
  .crl-header .crl-logo-truck{ display:none; }
}
/* The nav used to be centred because the CTA held down a third column. With the CTA moved to
   the utility strip the nav owns the space to the right edge, and leaving it centred puts a
   140px hole between the last link and the edge that reads as a mistake.
   Two things had to be true, and only the second is obvious:
     1. justify-self is a NO-OP here. .crl-navwrap is a block module inside the column, not the
        grid item itself — the column is. It stayed for the mobile burger's sake and does
        nothing on its own.
     2. Divi shrink-wraps the text module and gives it auto side margins, so it was 787px wide
        and centred inside a 1018px column. Aligning the flex nav INSIDE that box just aligned
        it within the same 787px. The module has to fill the column first. */
.crl-header .crl-navwrap{ justify-self:end; width:100%; margin-left:0; margin-right:0; }
.crl-header .crl-navwrap .et_pb_text_inner{ display:flex; align-items:center;
  justify-content:flex-end; }
.crl-header .crl-nav{ display:flex; align-items:center; gap:12px; }
.crl-header .crl-navitem{ position:relative; }
.crl-header .crl-nav a{ display:inline-flex; align-items:center; gap:4px; font-size:12.5px;
  font-weight:500; line-height:18.75px; color:rgba(6,27,49,.8); white-space:nowrap; }
.crl-header .crl-nav a:hover{ color:var(--red); }
.crl-header .crl-nav a.crl-nav-on{ color:var(--red); }

/* dropdowns — every value measured off the source's own panel, which is always in the DOM and
   only toggled visible, so it can be read without hovering.
   The 12px `padding-top` is deliberate: it bridges the gap between the trigger and the panel so
   the pointer never crosses dead space and the menu never flickers shut. */
.crl-header .crl-drop{ position:absolute; left:50%; top:100%; transform:translateX(-50%);
  width:224px; padding-top:12px; z-index:50; visibility:hidden; opacity:0;
  transition:opacity .16s ease, visibility .16s ease; }
.crl-header .crl-navitem:hover > .crl-drop,
.crl-header .crl-navitem:focus-within > .crl-drop{ visibility:visible; opacity:1; }
.crl-header .crl-drop-in{ background:#FBF8F2; border:1px solid var(--line); padding:8px;
  box-shadow:0 18px 40px rgba(6,28,49,.10); }
.crl-header .crl-drop-in a{ display:block; font-size:13px; line-height:19.5px; font-weight:500;
  color:rgba(6,28,49,.8); padding:8px 12px; }
.crl-header .crl-drop-in a:hover{ color:var(--red); background:rgba(239,231,217,.5); }
/* one more level: Employment flies out sideways to the two job posts */
.crl-header .crl-drop-row{ position:relative; display:flex; align-items:center; }
.crl-header .crl-drop-row > a{ flex:1; }
.crl-header .crl-drop-more{ display:flex; padding-right:10px; transform:rotate(-90deg);
  opacity:.6; }
/* The last three triggers sit at the right edge, so their panels anchor there instead of
   centring — a centred one hangs off the page. Direct child only: the flyout nested inside
   keeps its own positioning. */
.crl-header .crl-navitem-end > .crl-drop{ left:auto; right:0; transform:none; }
/* Opens LEFT, not right. About sits near the right edge now that the nav is right-aligned, so
   a flyout at left:100% hangs 63px off the page and gives the whole document a horizontal
   scrollbar at 1280 — a bug you only see at exactly the container width, with a submenu open.
   There is always room on the left; there is not always room on the right. */
.crl-header .crl-drop-fly{ right:100%; left:auto; top:0; transform:none; width:256px;
  padding:0 8px 0 0; }
.crl-header .crl-drop-row:hover > .crl-drop-fly,
.crl-header .crl-drop-row:focus-within > .crl-drop-fly{ visibility:visible; opacity:1; }
.crl-header .crl-chev{ opacity:.6; transition:transform .16s ease; }
/* the source flips the chevron while its panel is open */
.crl-header .crl-navitem:hover > a .crl-chev,
.crl-header .crl-navitem:focus-within > a .crl-chev{ transform:rotate(180deg); }
.crl-header .crl-btn .et_pb_button{ padding:14px 24px !important; }

/* ---- 2. hero ------------------------------------------------------------- */
.crl-hero{ position:relative; isolation:isolate; overflow:hidden; }
/* The media row is the hero's only positioned ancestor chain. Divi's column/module wrappers are
   position:relative and collapse to 0 height around an absolutely-positioned child, which makes
   inset:0 resolve to nothing — force the whole chain static + full height. */
.crl-hero .crl-heromedia-row.et_pb_row{ position:absolute !important; inset:0; z-index:0;
  width:100% !important; max-width:none !important; padding:0 !important; margin:0 !important; }
.crl-hero .crl-heromedia-row > .et_pb_column,
.crl-hero .crl-heromedia-row .et_pb_code,
.crl-hero .crl-heromedia-row .et_pb_code_inner{ position:static !important; width:100% !important;
  height:100% !important; margin:0 !important; padding:0 !important; }
/* The dark ground is not cosmetic: a 25MB reel takes a beat to paint its first frame, and
   without it the hero opens as the navy-gradient overlay over nothing. */
.crl-hero-media{ position:absolute; inset:0; overflow:hidden; pointer-events:none;
  background:#040E1A; }
/* Self-hosted mp4, so the fill is one line of object-fit. The YouTube embed this replaced
   needed 177.78vh/56.25vw cover math AND an override for FitVids, which wraps every iframe in
   .fluid-width-video-wrapper and pins it to 100%x100% with max-width:100%. FitVids does not
   touch <video>, so both hacks are gone rather than kept "just in case". */
.crl-hero-media video{ position:absolute; inset:0; display:block; border:0;
  width:100% !important; height:100% !important; max-width:none !important;
  object-fit:cover; object-position:center; }
.crl-hero-media::after{ content:''; position:absolute; inset:0;
  background:linear-gradient(rgba(4,14,26,.85),rgba(4,14,26,.55),rgba(4,14,26,.9)); }
.crl-hero .crl-hero-copy,
.crl-hero .crl-statbar{ position:relative; z-index:2; }
.crl-hero .crl-h1 h1{ padding-bottom:0; max-width:896px; }
.crl-hero .crl-lede p{ max-width:672px; }
/* Full-bleed band, contained content. Divi emits `.et_pb_row_N.et_pb_row{padding:…!important}`
   (two classes) — this needs three to win the cascade. */
.crl-hero .crl-statbar.et_pb_row{ background:rgba(6,28,49,.7); -webkit-backdrop-filter:blur(8px);
  backdrop-filter:blur(8px); border-top:1px solid rgba(250,246,238,.15);
  display:grid; grid-template-columns:repeat(4,1fr); gap:32px;
  padding-left:max(32px,calc((100% - 1216px)/2)) !important;
  padding-right:max(32px,calc((100% - 1216px)/2)) !important; }
.crl .crl-statn{ font-family:'TikTok Sans',sans-serif; font-weight:900; font-size:48px;
  line-height:48px; color:var(--c2); }
.crl .crl-statn-red{ color:var(--red); }
.crl .crl-statl{ font-size:12px; letter-spacing:1.92px; text-transform:uppercase;
  color:rgba(250,247,238,.6); margin-top:1px; line-height:16px; }

/* ---- 3. port ticker ------------------------------------------------------ */
.crl-ticker{ border-top:1px solid var(--line); border-bottom:1px solid var(--line); }
.crl-ticker .crl-tick-row{ padding:0 !important; }
.crl-tick{ display:flex; overflow:hidden; padding:20px 0; }
.crl-tick-track{ display:flex; flex:0 0 auto; align-items:center; gap:48px; padding-right:48px;
  white-space:nowrap; animation:crl-tick 40s linear infinite; }
.crl-tick-i{ font-size:14px; font-weight:500; letter-spacing:2.52px; text-transform:uppercase;
  color:var(--navy); line-height:20px; }
.crl-dia{ color:var(--red); }
@keyframes crl-tick{ from{ transform:translateX(0); } to{ transform:translateX(-100%); } }
@media (prefers-reduced-motion:reduce){ .crl-tick-track{ animation:none; } }

/* ---- 4. split form ------------------------------------------------------- */
.crl .crl-split-row{ display:grid; grid-template-columns:minmax(0,682.66fr) minmax(0,469.34fr);
  gap:64px; align-items:start; }
.crl .crl-split-left{ display:grid; grid-template-columns:1fr 1fr; column-gap:32px; row-gap:0;
  align-content:start; }
.crl .crl-split-left > .et_pb_module{ grid-column:1 / -1; }
/* one full-width rule above the 2x2 — two half-width borders would leave a gap at the column gap */
.crl .crl-split-left > .crl-featdiv{ grid-column:1 / -1; height:0; margin-top:48px;
  border-top:1px solid var(--line); }
.crl .crl-split-left > .crl-feat{ grid-column:auto; margin-top:32px; }
.crl .crl-ficon{ display:block; width:24px; height:24px; color:var(--red); margin-bottom:14px; }
.crl .crl-ftitle{ font-family:'TikTok Sans','Inter',sans-serif; font-stretch:90%;
  font-size:18px; font-weight:500; color:var(--navy); line-height:28px; }
.crl .crl-fsub{ font-size:14px; font-weight:400; color:var(--muted); line-height:20px;
  margin-top:4px; }

/* quote card — class names are Gravity Forms' own, so this CSS survives the swap */
.crl .crl-cardwrap{ margin:0; }
.crl .crl-card{ background:#FFFFFF; border-left:2px solid var(--red); padding:32px; }
.crl .crl-card-head{ display:flex; align-items:center; gap:16px; margin-bottom:20px; }
.crl .crl-card-t{ font-size:12px; font-weight:600; letter-spacing:2.16px;
  text-transform:uppercase; color:var(--red); line-height:18px; white-space:nowrap; }
.crl .crl-card-rule{ flex:1 1 auto; height:1px; background:var(--line); }
.crl .crl-form{ display:grid; grid-template-columns:1fr 1fr; gap:20px; }
.crl .gfield--full, .crl .gform_footer{ grid-column:1 / -1; }
.crl .gfield_label{ display:block; font-size:12px; font-weight:600; letter-spacing:2.16px;
  text-transform:uppercase; color:var(--red); margin-bottom:8px; line-height:18px; }
.crl .gfield_required{ color:var(--red); }
.crl .ginput_container input,
.crl .ginput_container select,
.crl .ginput_container textarea{
  width:100%; background:var(--c1); border:1px solid var(--line); border-radius:0;
  padding:12px 16px; font-size:14px; color:var(--navy); line-height:20px; height:46px;
  -webkit-appearance:none; appearance:none; }
.crl .ginput_container textarea{ height:106px; resize:vertical; }
.crl .ginput_container select{ height:45px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23061C31' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 14px center; padding-right:40px; }
.crl .ginput_container ::placeholder{ color:#9AA5AF; }
.crl .gform_footer{ display:flex; flex-direction:column; align-items:flex-start; gap:16px; }
.crl .crl-formnote{ font-size:12px; color:var(--muted); line-height:18px; }
.crl .gform_button{ background:var(--red); color:#FBF8F1; border:0; border-radius:0;
  padding:14px 24px; font-size:14px; font-weight:600; letter-spacing:.56px; text-transform:uppercase;
  cursor:pointer; line-height:20px; }

/* ---- 5. services intro --------------------------------------------------- */
.crl .crl-intro-row, .crl .crl-tst-head{ display:flex; justify-content:center; }
.crl .crl-intro-row > .et_pb_column.crl-intro,
.crl .crl-tst-head > .et_pb_column.crl-intro{ flex:0 0 672px; width:672px !important;
  max-width:100%; text-align:center; float:none !important; margin:0 !important; }
.crl-svc-intro .crl-intro h2{ padding-bottom:0; }

/* ---- 6..11. service panels ---------------------------------------------- */
.crl-panel{ position:relative; isolation:isolate; overflow:hidden; min-height:440px;
  display:flex; align-items:flex-end; border-top:1px solid rgba(250,246,238,.1); }
.crl-panel > .et_pb_row{ position:relative; z-index:2; }
.crl-panel .crl-p-row{ width:100%; }
.crl-panel .crl-p-col{ display:grid; grid-template-columns:176px minmax(0,1fr) auto; gap:32px;
  align-items:end; width:100% !important; }
.crl-panel .crl-p-count{ padding-bottom:6px; }
.crl-panel .crl-p-count .et_pb_text_inner{ display:flex; align-items:center; gap:18px; }
.crl .crl-count{ font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;
  font-size:12px; letter-spacing:2.88px; line-height:16px; text-transform:uppercase;
  color:rgba(250,247,238,.6); white-space:nowrap; }
.crl .crl-count-rule{ flex:1 1 auto; height:1px; background:rgba(250,246,238,.25); }
.crl .crl-picon{ display:block; width:36px; height:36px; color:var(--c2); margin-bottom:20px; }
.crl-panel .crl-p-body h3{ padding-bottom:0; margin-bottom:20px; max-width:696px; }
.crl-panel .crl-p-body p{ max-width:576px; }
.crl-panel .crl-p-learn{ padding-bottom:6px; }
.crl .crl-learn{ font-size:14px; font-weight:600; letter-spacing:2.24px; text-transform:uppercase;
  color:var(--c2); white-space:nowrap; }
.crl .crl-learn:hover{ color:#FFFFFF; }

/* ---- 12. video reel ------------------------------------------------------ */
.crl .crl-reel-head{ display:grid; grid-template-columns:minmax(0,696fr) minmax(0,448fr); gap:72px;
  align-items:end; }
.crl .crl-reel-head .crl-mb20{ margin-bottom:32px !important; }
.crl .crl-reel-stats.et_pb_row{ margin-top:80px !important; }
.crl .crl-reel-lede{ text-align:right; }
.crl .crl-reel-vid{ padding:0 !important; }
.crl .crl-reel-video .et_pb_video_box{ aspect-ratio:16/9; }
.crl .crl-reel-video iframe{ width:100%; height:100%; aspect-ratio:16/9; display:block; }
.crl .crl-reel-stats{ display:grid; grid-template-columns:repeat(4,1fr); column-gap:24px;
  row-gap:40px; background-image:linear-gradient(rgba(250,246,238,.15),rgba(250,246,238,.15)); background-size:calc(100% - 64px) 1px; background-position:32px 0; background-repeat:no-repeat; }
.crl .crl-reel-stats .crl-statn{ font-size:60px; line-height:60px; }

/* ---- 13. global reach ---------------------------------------------------- */
.crl .crl-reach-row{ display:grid; grid-template-columns:1fr 1fr; gap:64px; align-items:center; }
.crl .crl-reach-right{ position:relative; }
.crl .crl-reach-img img{ width:576px; height:720px; object-fit:cover; display:block; }
.crl .crl-coordcard{ position:absolute; left:-25px; bottom:-27px; background:var(--c1);
  border-left:2px solid var(--red); padding:24px 26px 22px; }
.crl .crl-coord{ font-family:'TikTok Sans',sans-serif; font-weight:500; font-size:30px;
  line-height:36px; color:var(--navy); }
.crl .crl-coord-l{ font-size:12px; letter-spacing:1.92px; text-transform:uppercase;
  color:var(--muted); margin-top:8px; }

/* ---- 14. split 2-up ------------------------------------------------------ */
.crl .crl-2up-row{ display:grid; grid-template-columns:1fr 1fr; gap:0; }
.crl .crl-2up-row > .et_pb_column{ position:relative; isolation:isolate; overflow:hidden; min-height:440px;
  display:flex; align-items:flex-end; padding:56px; }
.crl .crl-2up-body{ position:relative; z-index:2; width:100%; }
.crl .crl-2up-eyebrow{ font-size:12px; font-weight:600; letter-spacing:2.16px;
  text-transform:uppercase; color:var(--red); margin-bottom:12px; line-height:18px; }
.crl .crl-2up-body h3{ padding-bottom:0; margin-bottom:16px; max-width:420px; }

/* ---- 15. testimonials ---------------------------------------------------- */
.crl .crl-tst-row{ display:grid; grid-template-columns:repeat(3,1fr); gap:32px;
  align-items:stretch; }
.crl .crl-tst-row > .et_pb_column{ display:flex; }
.crl .crl-tst-card{ background:#FFFFFF; border-left:2px solid var(--red); padding:32px;
  display:flex; flex-direction:column; width:100%; }
.crl .crl-tst-card blockquote{ font-family:'TikTok Sans',sans-serif; font-weight:400; font-size:18px;
  line-height:29.25px; color:var(--navy); margin:0; padding:0; border:0; font-style:normal; }
.crl .crl-tst-rule{ height:1px; background:var(--line); margin:26px 0 0; }
.crl .crl-tst-n{ font-size:16px; font-weight:500; color:var(--navy); margin-top:22px; }
.crl .crl-tst-r{ font-size:12px; letter-spacing:1.68px; text-transform:uppercase;
  color:var(--muted); margin-top:4px; }

/* ---- 16. cta band -------------------------------------------------------- */
.crl .crl-cta-row{ display:grid; grid-template-columns:1fr 1fr; gap:48px; align-items:center; }
.crl .crl-cta-btns{ display:flex; flex-wrap:wrap; gap:16px; justify-content:flex-end; }
.crl .crl-cta-btns .crl-btn-inline{ margin-right:0; }

/* ---- 17. footer ---------------------------------------------------------- */
.crl .crl-foot-row{ display:grid;
  grid-template-columns:minmax(0,478.67fr) minmax(0,268fr) minmax(0,162.67fr) minmax(0,162.67fr);
  gap:48px; align-items:start; }
.crl .crl-flogo img{ width:118.8px; height:36px; object-fit:contain; display:block;
  filter:brightness(0) invert(1); }
.crl .crl-fblurb p{ font-size:14px; line-height:23px; color:var(--c2); margin-top:26px;
  max-width:420px; }
.crl .crl-fcontact{ margin-top:28px; }
/* measured: the footer contact rows are rgba(250,246,237,.80), not solid cream */
.crl .crl-crow{ display:flex; align-items:center; gap:12px; margin-bottom:16px;
  color:rgba(250,246,237,.8); }
.crl .crl-crow:last-of-type{ margin-bottom:0; }
.crl .crl-cicon{ width:16px; height:16px; color:var(--red); flex:0 0 16px; }
.crl .crl-crow a, .crl .crl-crow span{ font-size:14px; color:inherit; line-height:20px; }
.crl .crl-social{ display:flex; gap:12px; margin-top:30px; }
.crl .crl-social a{ width:40px; height:40px; display:flex; align-items:center;
  justify-content:center; border:1px solid rgba(250,246,238,.2); color:var(--c2); }
.crl .crl-social a:hover{ border-color:var(--red); color:var(--red); }
.crl .crl-sicon{ width:16px; height:16px; }
.crl .crl-fhead{ font-size:12px; font-weight:600; letter-spacing:2.16px; text-transform:uppercase;
  color:var(--red); margin-bottom:22px; line-height:18px; }
.crl .crl-flist{ list-style:none !important; margin:0; padding:0; }
.crl .crl-flist li{ list-style:none !important; margin:0 0 15px; padding:0; }
.crl .crl-flist li:last-child{ margin-bottom:0; }
.crl .crl-flist a, .crl .crl-flist li{ font-size:14px; color:var(--c2); line-height:17px; }
.crl .crl-flist a:hover{ color:var(--red); }
.crl .crl-legal-row{ background-image:linear-gradient(rgba(250,246,238,.1),rgba(250,246,238,.1)); background-size:calc(100% - 64px) 1px; background-position:32px 0; background-repeat:no-repeat; }
.crl .crl-legal .et_pb_text_inner{ display:flex; align-items:center;
  justify-content:space-between; gap:24px; height:64px; }
.crl .crl-legal-l{ font-size:12px; color:var(--c2); }
.crl .crl-legal-r{ display:flex; gap:32px; }
.crl .crl-legal-r span{ font-size:12px; color:var(--c2); }

/* ==========================================================================
   MEASURED CORRECTIONS — generated by scripts/carroll_stylediff.mjs from the source's
   own computed styles. Never hand-typed: run the differ, fold in what it emits.
   ========================================================================== */
.crl-split .crl-formnote{ font-weight:400; line-height:16px; }   /* x1 */
.crl-svc-intro .crl-center p{ color:rgba(6,28,48,0.70); }   /* x1 */
.crl-panel .crl-p-body p{ font-weight:400; color:rgba(250,246,239,0.85); }   /* x6 */
.crl-reel .crl-statl{ font-size:14px; line-height:20px; margin-top:3px; }   /* x4 */
.crl-reach .crl-coord-l{ line-height:16px; color:rgba(7,28,48,0.60); }   /* x1 */
.crl-tst .crl-tst-r{ font-weight:400; line-height:16px; }   /* x3 */
.crl-footer .crl-flist a{ line-height:20px; color:rgba(250,246,238,0.75); }   /* x10 */
.crl-footer .crl-flist-plain li{ line-height:20px; color:rgba(250,246,238,0.75); }   /* x4 */
.crl-footer .crl-legal-l{ line-height:16px; color:rgba(249,245,237,0.50); }   /* x1 */
.crl-footer .crl-legal-r span{ line-height:16px; color:rgba(249,245,237,0.50); }   /* x3 */

/* ==========================================================================
   MOBILE — 390px reference. Source stacks everything to one column.
   ========================================================================== */
@media (max-width:980px){
  .crl .crl-split-row, .crl .crl-reach-row, .crl .crl-cta-row, .crl .crl-reel-head,
  .crl .crl-2up-row{ grid-template-columns:1fr; gap:40px; }
  .crl .crl-foot-row{ grid-template-columns:1fr 1fr; gap:40px; }
  .crl .crl-tst-row{ grid-template-columns:1fr; gap:24px; }
  .crl .crl-reel-lede{ text-align:left; }
  .crl .crl-cta-btns{ justify-content:flex-start; }
  .crl .crl-reach-img img{ width:100%; height:auto; }
  .crl .crl-coordcard{ left:0; bottom:-16px; }
}
/* ---- mobile menu --------------------------------------------------------
   The source swaps to the burger at 1280 (`xl:hidden`), NOT 768. Built at 768, the whole
   768–1279 band — every tablet and every half-width laptop window — rendered eight desktop
   nav items squeezed into a header they overflowed. The breakpoint is part of the measurement.
   Panel geometry read off the source at 390: 14px/500 parents, 13px/400 children indented
   16+12 behind a 1px rule, 4px between rows, 16/20 padding, CTA 12px below the last row. */
.crl .crl-burger{ display:none; background:none; border:0; padding:0; cursor:pointer;
  align-items:center; justify-content:center; width:24px; height:24px; color:var(--navy); }
.crl .crl-burger svg{ display:block; }
.crl .crl-burger .crl-ic-x{ display:none; }
.crl-header.crl-menu-open .crl-burger .crl-ic-menu{ display:none; }
.crl-header.crl-menu-open .crl-burger .crl-ic-x{ display:block; }
.crl .crl-mnav{ display:none; }

@media (max-width:1279px){
  /* col 2 holds the burger, so it goes to the right edge. There is no third column any more —
     the CTA moved to the utility strip, and the panel carries its own copy of the button. */
  .crl-header .crl-hdr-row.et_pb_row{ grid-template-columns:auto auto; }
  .crl-header .crl-hdr-row > .et_pb_column:nth-child(2){ justify-self:end; }
  .crl-header .crl-navwrap{ justify-self:end; }
  .crl-header .crl-navwrap .crl-nav{ display:none; }
  .crl .crl-burger{ display:flex; }
  /* the strip survives on tablets whole; the phone-only version is in the 767 block */
  .crl-header .crl-util{ gap:16px; }
  .crl-header .crl-util-cta{ font-size:11px; padding:6px 12px; }

  /* Divi gives BOTH .et_pb_row and .et_pb_column position:relative, so an absolute panel
     anchors to the 24px-wide burger column and renders as a one-character-per-line ribbon
     down the right edge. Flatten the chain and the panel resolves against .crl-header, which
     is position:sticky — full-bleed, and it travels with the header.
     FOUR wrappers are positioned, not one: the row, the column, the module, and the
     .et_pb_text_inner Divi puts inside every text module. Miss any and the panel anchors to
     the 24px burger cell. */
  .crl-header .crl-hdr-row.et_pb_row,
  .crl-header .crl-hdr-row > .et_pb_column,
  .crl-header .crl-navwrap.et_pb_module,
  .crl-header .crl-navwrap .et_pb_text_inner{ position:static; }
  .crl-header.crl-menu-open .crl-mnav{ display:flex; }
  /* OPAQUE, and no backdrop-filter of its own. The source's panel is in flow and PUSHES the
     page down, so what sits behind it is the page background. This one overlays, so a
     translucent panel (or a nested backdrop-filter, which leaks worse than its alpha suggests)
     shows the hero headline straight through the menu. */
  .crl-header .crl-mnav{ position:absolute; top:100%; left:0; right:0; z-index:60;
    flex-direction:column; gap:4px; padding:16px 32px; text-align:left;
    background:#FBF8F2; border-bottom:1px solid rgba(227,221,211,.6);
    max-height:calc(100vh - var(--crl-hdr-h));  overflow-y:auto; overscroll-behavior:contain; }
  /* Divi runs wpautop over text-module content, so every one of these anchors arrives wrapped
     in a <p>. Without this the flex items are the paragraphs, not the links: `gap` measures
     the wrong boxes and `align-self` on the CTA does nothing, so it stretches full width. */
  .crl-header .crl-mnav p{ display:contents; }
  .crl-header .crl-mnav a{ display:block; text-decoration:none; }
  .crl-header .crl-mnav-l1{ padding:8px 0; font-size:14px; font-weight:500; line-height:20px;
    color:rgba(6,27,49,.8); }
  /* no gap inside a group — parent runs straight into its first child, source-measured */
  .crl-header .crl-mnav-grp{ display:flex; flex-direction:column; }
  .crl-header .crl-mnav-sub{ display:flex; flex-direction:column; margin-left:16px;
    padding-left:12px; border-left:1px solid var(--line); }
  .crl-header .crl-mnav-l2{ padding:6px 0; font-size:13px; font-weight:400; line-height:19.5px;
    color:rgba(6,27,49,.7); }
  /* the third level (the two job posts) drops another half-point, not a full point */
  .crl-header .crl-mnav-l3{ padding:6px 0; font-size:12.5px; font-weight:400; line-height:18.75px;
    color:rgba(6,27,49,.7); }
  .crl-header .crl-mnav-l1:hover, .crl-header .crl-mnav-l2:hover, .crl-header .crl-mnav-l3:hover,
  .crl-header .crl-mnav-l1:focus-visible, .crl-header .crl-mnav-l2:focus-visible,
  .crl-header .crl-mnav-l3:focus-visible{ color:var(--red); }
  .crl-header .crl-mnav-cta{ align-self:flex-start; margin-top:12px; padding:14px 24px;
    background:var(--red); color:#FBF8F1; font-size:14px; font-weight:600; letter-spacing:.56px;
    text-transform:uppercase; line-height:21px;
    display:flex !important; align-items:center; gap:8px; }
  .crl-header .crl-mnav-cta svg{ flex:0 0 14px; }
  /* the email under the panel CTA — the utility strip drops it on phones */
  .crl-header .crl-mnav-mail{ margin-top:14px; font-size:13px; line-height:18px;
    color:rgba(6,27,49,.7); text-decoration:none; word-break:break-all; }
  .crl-header .crl-mnav-cta:hover{ color:#FBF8F1; opacity:.92; }
}

@media (max-width:767px){
  /* the source's container drops from 32px to 20px here; Divi writes the row padding with
     !important, so the override has to carry .et_pb_row too */
  .crl-header .crl-hdr-row.et_pb_row{ padding-left:20px !important; padding-right:20px !important; }
  .crl-header .crl-mnav{ padding:16px 20px; }
  /* A phone is the one device where a tap-to-call number earns its space, so the number stays
     and everything else in the strip goes to the panel. 32 + 80 + 1px border = 113. */
  .crl-header{ --crl-hdr-h:113px; }
  .crl-header .crl-util-row.et_pb_row{ padding-left:20px !important; padding-right:20px !important; }
  .crl-header .crl-util{ justify-content:center; height:32px; gap:0; }
  .crl-header .crl-util-sep,
  .crl-header .crl-util-mail,
  .crl-header .crl-util-cta{ display:none; }
  .crl-header .crl-util-phone{ font-size:13.5px; font-weight:600; }
  /* Divi emits `.et_pb_row_N.et_pb_row{padding:…!important}` — a media query does not beat
     specificity, so every row-padding override in here needs `.et_pb_row` too. */
  .crl-hero .crl-hero-copy.et_pb_row{ padding-top:146px !important; padding-bottom:148px !important; }
  .crl-panel .crl-p-row.et_pb_row{ padding-top:40px !important; padding-bottom:40px !important; }
  .crl-panel .crl-p-col{ gap:16px; }
  .crl-svc-intro .crl-h2 h2{ font-size:28px !important; line-height:30.5px !important; }
  /* the source drops the background video on small screens */
  .crl-hero .crl-heromedia-row.et_pb_row{ display:none; }
  .crl .crl-h1 h1{ font-size:31px !important; line-height:34px !important; max-width:none; }
  .crl .crl-eyebrow{ gap:12px; }
  .crl .crl-rule{ width:32px; flex:0 0 32px; }
  .crl .crl-h2 h2{ font-size:30px !important; line-height:33px !important; }
  .crl-panel .crl-p-body h3{ line-height:37.8px; }
  .crl-hero .crl-statbar.et_pb_row{ grid-template-columns:1fr 1fr; row-gap:32px; column-gap:24px;
    padding-left:20px !important; padding-right:20px !important; }
  .crl .crl-reel-stats.et_pb_row{ grid-template-columns:1fr 1fr; }
  .crl .crl-pt128.et_pb_row{ padding-top:96px !important; }
  .crl .crl-pb128.et_pb_row{ padding-bottom:96px !important; }
  /* panels are min-h-[40vh] on phones, min-h-[44vh] only from md up */
  .crl-panel{ min-height:40vh; }
  /* the source uses a 20px gutter on phones, not 32 */
  .crl .et_pb_row{ padding-left:20px !important; padding-right:20px !important; }
  .crl .crl-2up-row.et_pb_row, .crl .crl-tick-row.et_pb_row,
  .crl .crl-heromedia-row.et_pb_row{ padding-left:0 !important; padding-right:0 !important; }
  .crl .crl-split-left{ grid-template-columns:1fr; }
  .crl .crl-split-left > .crl-feat:nth-of-type(2){ margin-top:32px; padding-top:0;
    border-top:0; }
  .crl .crl-form{ grid-template-columns:1fr; }
  .crl .crl-foot-row{ grid-template-columns:1fr; }
  .crl .crl-legal .et_pb_text_inner{ flex-direction:column; align-items:flex-start; height:auto;
    padding:24px 0; gap:12px; }
  .crl .crl-legal-r{ flex-direction:column; gap:6px; }
  /* on phones the counter moves to the TOP of the panel; keeping the desktop bottom-alignment
     here pushed it above the panel's overflow:hidden edge and silently clipped it */
  .crl-panel{ align-items:flex-start; }
  .crl-panel .crl-p-col{ grid-template-columns:1fr; gap:16px; }
  .crl-panel .crl-p-count{ order:-1; }
  .crl-panel .crl-p-count .et_pb_text_inner{ gap:14px; }
  .crl .crl-2up-row > .et_pb_column{ padding:40px; }
  .crl .crl-coordcard{ position:relative; left:0; bottom:0; margin-top:-40px; width:max-content; }

  /* measured corrections @390 — generated by scripts/carroll_stylediff.mjs.
     APPEND new runs, never replace: each patch is a DELTA against the current build, so
     swapping the block for the latest delta silently drops every earlier correction. */
  .crl-hero .crl-statn-red{ line-height:40px; }
  .crl-hero .crl-statl{ line-height:16px; }
  .crl-panel .crl-p-body h3{ font-size:36px; }
  .crl-panel .crl-p-body p{ font-size:16px; line-height:26px; }
  /* three classes, to match the desktop rule it overrides — a media query does not add
     specificity, so `.crl-reel .crl-statn` lost to `.crl .crl-reel-stats .crl-statn` */
  .crl .crl-reel-stats .crl-statn{ font-size:48px; line-height:48px; }
  .crl-reel .crl-statl{ font-size:14px; line-height:20px; letter-spacing:2.24px; }
  .crl-2up .crl-2up-body h3{ font-size:22px; line-height:25.3px; }
  .crl-hero .crl-statn-red{ font-size:36px; }   /* x4 */
  .crl-split .crl-card-t{ margin-top:20px; }   /* x1 */
  .crl-split .crl-formnote{ margin-top:7px; }   /* x1 */
  .crl-panel .crl-p-body h3{ margin-top:10px; }   /* x6 */
  .crl-tst .crl-tst-n{ margin-top:27px; }   /* x1 */
  .crl-footer .crl-fhead{ margin-top:8px; }   /* x2 */
  .crl-footer .crl-legal-r span{ margin-top:6px; }   /* x2 */
}

/* ========== generic page patterns (all pages except home) ========== */
.crl .crl-s{ position:relative; }
.crl .crl-h1 h1, .crl .crl-h2 h2, .crl .crl-h3 h3, .crl .crl-h4 h4{ padding-bottom:0; }
.crl .et_pb_text_inner > *:last-child{ margin-bottom:0; }
.crl .crl-s .et_pb_module{ margin-bottom:0; }
.crl .crl-s .et_pb_column > .et_pb_module:last-child{ margin-bottom:0; }
.crl .crl-eyebrow-solo p{ font-size:12px !important; font-weight:600; letter-spacing:2.16px;
  text-transform:uppercase; color:var(--red) !important; line-height:18px; }

/* the quote form on /quote and /contact — GF class names, so the swap is one line */
.crl .crl-form-page{ display:grid; grid-template-columns:1fr 1fr; gap:24px; }
.crl .crl-form-page .gfield--full, .crl .crl-form-page .gform_footer{ grid-column:1 / -1; }
.crl .crl-form-page .gfield_label{ display:block; font-size:12px; font-weight:600;
  letter-spacing:2.16px; text-transform:uppercase; color:var(--red); margin-bottom:8px;
  line-height:18px; }
.crl .crl-form-page .gfield_required{ color:var(--red); }
.crl .crl-form-page .gfield_description{ display:block; margin-top:6px; font-size:12px;
  line-height:18px; color:var(--muted); }
.crl .crl-form-page .crl-formaside{ font-size:14px; }
/* three classes ties with the .gform_footer rule below, and that one is printed later —
   qualify on the element itself so the modifier actually wins */
.crl .crl-form-page .gform_footer.gform_footer--left{ justify-content:flex-start;
  gap:16px; }
/* the source styles the file control's own button; the raw browser widget reads as unfinished */
.crl .crl-form-page input[type=file]{ padding:0; display:flex; align-items:center; }
.crl .crl-form-page input[type=file]::file-selector-button{ background:var(--navy);
  color:var(--c2); border:0; border-radius:0; padding:14px 18px; margin-right:16px;
  font-size:12px; font-weight:600; letter-spacing:1.68px; text-transform:uppercase;
  cursor:pointer; height:44px; }
.crl .crl-form-page input, .crl .crl-form-page select, .crl .crl-form-page textarea{
  width:100%; background:var(--c1); border:1px solid var(--line); border-radius:0;
  padding:12px 16px; font-size:14px; color:var(--navy); line-height:20px; height:46px;
  -webkit-appearance:none; appearance:none; }
.crl .crl-form-page textarea{ height:132px; resize:vertical; }
.crl .crl-form-page select{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23061C31' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 14px center; padding-right:40px; }
/* the homepage's split form sets `.crl .gform_footer{ flex-direction:column }`. This rule wins
   on every property it DECLARES — and it never declared flex-direction, so the column survived
   and the /quote footer stacked its note above a centred button instead of note-left,
   button-right. An override has to reset every property the rule it overrides sets. */
.crl .crl-form-page .gform_footer{ display:flex; flex-direction:row; align-items:center;
  justify-content:space-between; gap:24px; flex-wrap:wrap; margin-top:4px; }
@media (max-width:767px){ .crl .crl-form-page .gform_footer{ flex-direction:column;
  align-items:flex-start; } }
.crl .crl-form-page .gform_button{ background:var(--red); color:#FBF8F1; border:0; border-radius:0;
  padding:14px 24px; font-size:14px; font-weight:600; letter-spacing:.56px; text-transform:uppercase;
  cursor:pointer; line-height:20px; }
@media (max-width:767px){ .crl .crl-form-page{ grid-template-columns:1fr; } }

/* Parent-page directory — the ruled index of children the source leaves orphaned.
   Deliberately the page's OWN hairline-list rhythm (20px above and below a 1px #DDD7CD rule)
   rather than a second card grid, so it reads as a reference list under the six photo cards
   instead of competing with them. */
.crl .crl-dir{ border-top:1px solid var(--line); }
.crl .crl-dir .crl-dir-row{ display:flex; align-items:baseline; gap:18px; padding:20px 0;
  border-bottom:1px solid var(--line); text-decoration:none; color:var(--navy); }
.crl .crl-dir .crl-dir-row:hover .crl-dir-t{ color:var(--red); }
.crl .crl-dir .crl-dir-n{ font-size:12px; font-weight:600; letter-spacing:1.8px; color:var(--red);
  min-width:26px; }
.crl .crl-dir .crl-dir-t{ font-family:'TikTok Sans',system-ui,sans-serif; font-stretch:90%;
  font-weight:700; font-size:19px; transition:color .2s; }
.crl .crl-dir .crl-dir-d{ flex:1; font-size:14px; line-height:22px; color:#5b6b7d; }
.crl .crl-dir .crl-dir-go{ color:var(--red); font-size:13px; font-weight:600; letter-spacing:.5px;
  white-space:nowrap; }
@media (max-width:780px){
  .crl .crl-dir .crl-dir-row{ flex-wrap:wrap; gap:6px 14px; }
  .crl .crl-dir .crl-dir-d{ flex:1 0 100%; order:3; }
  .crl .crl-dir .crl-dir-go{ order:2; margin-left:auto; } }

/* FAQ — native Divi accordion styled to the source's hairline rows */
.crl .crl-faq.et_pb_toggle, .crl .crl-faq .et_pb_toggle{ background:transparent !important; border:0 !important;
  border-bottom:1px solid var(--line) !important; padding:26px 0 !important; margin:0 !important; }
.crl .crl-faq .et_pb_toggle_title{ font-family:'Inter',system-ui,sans-serif; font-stretch:100%;
  font-size:18px !important; font-weight:500; line-height:28px; color:var(--navy) !important;
  padding:0 40px 0 0 !important; cursor:pointer; }
/* Divi's toggle glyph is a CIRCLED plus in the ETmodules icon font; the source is a bare Lucide
   plus (`M5 12h14` + `M12 5v14`, 20px box, red, and it does NOT change or rotate when the row
   opens). Colour and size matched exactly and the two still looked nothing alike — the
   difference was the GLYPH, which no computed-style check compares.

   Painted as a background on the title, not as a pseudo-element: absolute positioning resolved
   against a box that was not the title (measured 12px high), and as a flex item it still sat
   6px high. A background is not in flow at all, and `center` is exact. */
.crl .crl-faq .et_pb_toggle_title{
  background:
    linear-gradient(var(--red),var(--red)) right 0 center/11.7px 1.7px no-repeat,
    linear-gradient(var(--red),var(--red)) right 5px center/1.7px 11.7px no-repeat !important; }
.crl .crl-faq .et_pb_toggle_title::before,
.crl .crl-faq .et_pb_toggle_open .et_pb_toggle_title::before{
  content:'' !important; display:none !important; }
.crl .crl-faq .et_pb_toggle_content{ padding:16px 0 0 !important; font-size:16px; line-height:27px; }
.crl .crl-faq .et_pb_toggle_content p{ margin:0 0 12px; }
.crl .crl-faq .et_pb_toggle_open{ background:transparent !important; }

/* checklists — the source's bullet lists, red tick, no marker */
.crl .crl-check{ list-style:none !important; margin:0; padding:0; }
.crl .crl-check li{ list-style:none !important; position:relative; padding-left:30px;
  margin:0 0 14px; line-height:27px; }
.crl .crl-check li:last-child{ margin-bottom:0; }
.crl .crl-check li span, .crl .crl-check li strong{ font:inherit; color:inherit;
  letter-spacing:inherit; }
/* measured: the source's own checklist item is `display:flex; gap:12px` with a 16px icon
   nudged down 2px — not our ::before tick with a 30px indent */
/* The list's own box is MEASURED per list and emitted as `.crl-lst-*` — /services/warehousing
   rules every item (20px padding, a 1px #DDD7CD rule, 20px margin, 20px icon) while
   /about/employment uses the same markup with no rule, no padding, 12px margin and a 16px icon.
   Hardcoding either one here got the other wrong by ~27px per item: the ruled overview sections
   ran 117px short, and when I then hardcoded the RULED values, employment ran 191px long.
   These are only the fallbacks for a list we could not measure. */
.crl .crl-check-own li::before{ content:none !important; }
.crl .crl-check-own li{ padding-left:0; display:flex; gap:12px; }
.crl .crl-check-own li svg{ flex:0 0 16px; width:16px; height:16px; margin-top:2px;
  color:var(--red); }
.crl .crl-check li::before{ content:''; position:absolute; left:0; top:9px; width:16px; height:9px;
  border-left:2px solid var(--red); border-bottom:2px solid var(--red);
  transform:rotate(-45deg); }

/* inline icons pulled from the source (Lucide, stroke 1.4) */
.crl .crl-chip{ display:inline-block; white-space:nowrap; z-index:2; }
.crl .crl-ico{ display:contents; }
.crl .crl-nicon{ display:block; width:28px; height:28px; color:var(--red); flex:0 0 auto; }
/* the source's inline rows are `flex-wrap:wrap`. Without it a two-button hero row squeezed both
   buttons onto one 390px line, wrapping "Request a Quote" and pushing the ghost off the edge. */
.crl .crl-inline{ margin:0; flex-wrap:wrap; }
.crl .crl-navlink-plain{ line-height:19.5px; white-space:nowrap; }
.crl .crl-navlink-plain:hover{ color:var(--red) !important; }
.crl .crl-inline > *{ margin:0 !important; }
.crl .crl-inline .crl-nicon{ width:18px; height:18px; }

/* embeds */
.crl .crl-embed .et_pb_video_box, .crl .crl-embed iframe{ width:100%; aspect-ratio:16/9; }
.crl .crl-embed-raw iframe{ width:100%; aspect-ratio:16/9; border:0; display:block; }

/* Generic interior cards carry their MEASURED background / border / padding inline. They must
   NOT be `.crl-card` — that class is the testimonial/quote card (white + 2px red left rule) and
   was drawing red rules on every service card. */
.crl .crl-gcard{ background:transparent; height:100%; }
.crl .crl-gcard-mod, .crl .crl-gcard-mod .et_pb_text_inner{ height:100%; }
.crl .crl-gcard, .crl .crl-item{ margin-bottom:0 !important; }
.crl .crl-item, .crl .crl-gcard-mod{ margin-bottom:0 !important; }
/* a card that IS a link — it must fill its grid cell and keep the cell's own type colours */
.crl .crl-cardlink{ height:100%; color:inherit; }
.crl .crl-stretch{ position:absolute; inset:0; }
/* Adjacent margins collapse in normal flow but NOT inside a flex column, so the authored
   bottom margins that are harmless in a block card stack on top of the measured top gaps and
   grew the /contact social cards by 66px. In a flex card the measured gap is the only spacing. */
.crl .crl-vcard > *{ margin-bottom:0 !important; }
.crl .crl-item > .et_pb_text_inner > *:first-child{ margin-top:0; }

/* card internals — composed as HTML inside ONE module so the card stays a unit */
.crl .crl-ch{ font-family:'TikTok Sans','Inter',sans-serif; font-stretch:90%; color:inherit;
  padding-bottom:0; margin:0 0 10px; }
.crl h3.crl-ch{ font-size:20px; font-weight:500; line-height:26px; }
.crl h4.crl-ch{ font-size:17px; font-weight:600; line-height:24px; }
/* NO opacity here. Every card paragraph already carries its MEASURED colour inline, and the
   source uses rgba (e.g. rgba(250,246,238,0.75)) to do the dimming. An extra opacity:.88
   multiplied on top rendered every card body at 0.66 alpha — invisible to the computed-style
   differ, because `color` still matched. Measured: the source has ZERO elements with an
   inherited opacity below 1. */
.crl .crl-cp{ color:inherit; margin:0 0 10px; }
.crl .crl-cp:last-child{ margin-bottom:0; }
.crl .crl-cimg{ display:block; width:100%; height:auto; }
.crl .crl-cimg[style*="aspect-ratio"]{ height:auto; }
.crl .crl-item .et_pb_image, .crl .crl-gcard-mod .et_pb_image{ margin-bottom:0; }
.crl .crl-s .et_pb_image img{ width:100%; }
.crl .crl-blk + .crl-blk{ margin-top:22px; }
.crl .crl-cbtn{ display:inline-flex; align-items:center; background:var(--red); color:#FBF8F1;
  font-size:14px; font-weight:600; letter-spacing:.56px; text-transform:uppercase;
  padding:14px 24px; margin-top:14px; }
.crl .crl-cbtn-ghost{ background:transparent; border:1px solid currentColor; color:inherit; }
.crl .crl-eyebrow-t{ font-size:12px; font-weight:600; letter-spacing:2.16px; text-transform:uppercase;
  color:var(--red); margin-bottom:10px; }

/* stat bands (hero + service pages): big numeral over a letterspaced uppercase label */
.crl .crl-statcell{ margin-bottom:0 !important; }
.crl .crl-statcell .crl-statn{ font-family:'TikTok Sans',sans-serif; font-stretch:90%;
  font-weight:900; font-size:48px; line-height:48px; color:var(--red); }
.crl .crl-statcell .crl-statl{ font-size:12px; letter-spacing:1.92px; text-transform:uppercase;
  margin-top:1px; line-height:16px; color:rgba(250,247,238,.6); }
.crl-s[class*="-1"] .crl-statcell .crl-statl{ color:var(--c2); }

/* self-hosted mp4 bands */
.crl .crl-mp4 .et_pb_video_box{ border:1px solid rgba(250,246,238,.1); background:#000; }
.crl .crl-mp4 video, .crl .crl-mp4 .et_pb_video_box video{ width:100%; display:block;
  aspect-ratio:16/9; object-fit:cover; }

@media (max-width:980px){
  .crl .crl-s .et_pb_row.crl-grid{ grid-template-columns:1fr !important; gap:32px !important; }
}
@media (max-width:767px){
  .crl .crl-s .et_pb_row{ padding-left:20px !important; padding-right:20px !important; }
  .crl .crl-h1 h1{ font-size:31px !important; line-height:34px !important; }
  .crl .crl-h2 h2{ font-size:30px !important; line-height:33px !important; }
  .crl .crl-h3 h3{ font-size:24px !important; line-height:28px !important; }
}
