/*
 * Section design styling — reproduces the bespoke Norlon page layouts (hero
 * overlay, 50th stripe, quote, card rows, two-column intros) that core blocks
 * can't express with visual controls alone. Scoped to section wrapper classes;
 * page CONTENT (text/images) stays fully block-editable. Driven by global tokens.
 */

:root {
	--nr-red: var(--wp--preset--color--norlon-red, #DE3412);
	--nr-ink: var(--wp--preset--color--ink, #231F20);
	--nr-signal: var(--wp--preset--color--signal-red, #EF4135);
	/* ---- accessible reds for SMALL text (< 18.66px bold / 24px regular) ----
	   Brand red #DE3412 clears 4.5:1 on WHITE (4.56) but fails on both of the other
	   surfaces it actually gets used on, and it fails in OPPOSITE directions — so
	   there are two tokens, not one. Use --nr-red for large text/graphics and on
	   white; use these only for small text on the named surface.
	     on #F0F0F0 light gray : #DE3412 = 4.00 FAIL -> #C42D0C = 4.94 PASS (darker)
	     on #231F20 dark ink   : #DE3412 = 3.58 FAIL -> #F4553F = 4.83 PASS (lighter)
	   #C42D0C is not a new colour — it is already the Services tab active state. */
	--nr-red-on-light: #C42D0C;
	--nr-red-on-dark: #F4553F;
	--nr-din: "URW DIN Cond", sans-serif;
	--nr-mont: "Montserrat", sans-serif;

	/* SINGLE SOURCE OF TRUTH for recurring elements — change here, every page
	   follows. Divider weight/colour, page-hero height, inner-page content width. */
	--nr-divider-w: 2px;
	--nr-divider-color: var(--wp--preset--color--hairline-gray, #D9D9D9);
	--nr-divider-red: var(--wp--preset--color--signal-red, #EF4135);
	/* The red active/hover underline — same element in the top nav AND the
	   service tabs, so one token drives both (R2 measured: 3px). */
	--nr-underline-w: 3px;
	--nr-hero-h: 433px;
	--nr-cw: 1160px;
}

/* Base is WHITE — sections are full-width stripes: white (base) alternating with
   gray/dark (alignfull groups with their own background). Kadence's default gray
   site background otherwise shows through the transparent "white" stripes. */
body { background-color: #ffffff !important; }

/* ============= GLOBAL: EVERY CONTROL IS SQUARE (0 RADIUS) =============
   The design is square throughout (global-components.md: "Shape: square (0 radius)").
   Kadence/Gravity Forms default buttons + fields to 3px, which had crept onto the
   Plans-Room access buttons, its password field, and the slider play button. One
   rule, site-wide — so a radius can never sneak back in per-component. */
button, input, select, textarea,
.wp-block-button__link, .wp-element-button,
.gform_wrapper input, .gform_wrapper select, .gform_wrapper textarea, .gform_wrapper button,
.gform_wrapper input[type="submit"], .norlon-dd-trigger, .norlon-dd-list { border-radius: 0 !important; }

/* ---- content container ----
   Kadence sets .site-container to max-width 1160px and then adds 24px edge
   padding INSIDE it, so real content starts at 164px (design: 140px). Widening
   the container by exactly the padding puts the content edge back on 140px and
   keeps the 1160px content width — this aligns the header, the page content and
   the Recent Projects slider in one move, while keeping gutters on small screens. */
/* !important because Kadence prints its own :root block after this stylesheet. */
:root {
	--global-content-width: 1208px !important;
	--global-calc-content-width: 1160px !important;
	--wp--style--global--content-size: 1160px !important;
}

/* ---- header placement (measured from the design) ----
   Logo is 87px tall and sits only 8px below the top of the viewport; the header
   row is ~104px with the logo + nav vertically centred on it. Kadence's default
   row padding pushes both far too low. */
#masthead .site-header-row-container-inner { padding-top: 0 !important; padding-bottom: 0 !important; }
/* R2-measured (page frames @1:1): the interior header is 151px tall — logo ink at
   y=28 and the hero band starting at y=151. Ours was 104, so the logo sat at 9 and
   every page rendered ~21px high. */
#masthead .site-header-row { min-height: 151px; }
#masthead .site-header-main-section-left,
#masthead .site-header-main-section-right,
#masthead .site-header-row { align-items: center; }
#masthead .site-branding { margin: 0 !important; padding: 0 !important; }
/* Design insets the nav from the container right edge (CONTACT ends at 1226).
   R2 @1440 — a DESKTOP value with no authority on phones; see the mobile-header
   block directly below, which is why that override exists. */
#masthead .site-header-main-section-right { padding-right: 42px; }

/* ---- mobile header (hamburger) ----
   Kadence renders a SEPARATE `.site-mobile-header-wrap` and swaps to the desktop
   header at ~1024px. Scoping to that wrapper instead of a media query means these
   rules are live exactly when Kadence shows the mobile header — there is no
   breakpoint to keep in sync (an earlier version sat in @media(max-width:900px)
   and left 900-1024px with the desktop inset still applied).
   The 42px above is a desktop nav inset; on a phone there is no nav, only the
   toggle, so it just shoved the hamburger 42px inside the gutter. */
#masthead .site-mobile-header-wrap .site-header-main-section-right { padding-right: 0; }
/* Pull the icon out by the button's own 8.4px padding so the GLYPH — not its
   hit-box — lands on the 24px gutter the logo and body copy share. */
#masthead .site-mobile-header-wrap .mobile-toggle-open-container { margin-right: -8px; }
/* Kadence centres the toggle on the 151px row (cy 76, level with the logo). The
   design wants it up in the hero's dark gradient, so break that alignment. */
#masthead .site-mobile-header-wrap .site-header-main-section-right { align-self: start; margin-top: 30px; }
#masthead .site-branding img.custom-logo { height: 87px !important; width: auto !important; max-height: 87px !important; }

/* ---- nav hover/active states ----
   Hover = 2px signal-red underline bar (text colour unchanged).
   Active/current page = Norlon-red text + the red underline. */
/* Design spaces the 5 nav items across ~573px; Kadence's default is far tighter. */
#masthead .main-navigation li.menu-item > a { position: relative; text-decoration: none !important; padding-left: 30px !important; padding-right: 30px !important; }
/* Bar is inset by the link's side padding so it hugs the text width, matching
   the design, and wipes in from the left on hover. */
/* Animate WIDTH, not transform:scaleX — scaling a thin element rasterises and
   renders it as an uneven wedge (thick left → thin right). Width keeps it crisp. */
#masthead .main-navigation li.menu-item > a::after {
	content: ""; position: absolute; left: 30px; bottom: -7px; height: var(--nr-underline-w); width: 0;
	background: var(--wp--preset--color--signal-red, #EF4135);
	transition: width .25s ease;
}
#masthead .main-navigation li.menu-item > a:hover::after,
#masthead .main-navigation li.menu-item > a:focus-visible::after,
#masthead .main-navigation li.current-menu-item > a::after,
#masthead .main-navigation li.current_page_item > a::after,
#masthead .main-navigation li.current-menu-parent > a::after { width: calc(100% - 60px); }
/* Active/current page = Norlon-red text (bar persists via the rule above). */
#masthead .main-navigation li.current-menu-item > a,
#masthead .main-navigation li.current_page_item > a,
#masthead .main-navigation li.current-menu-parent > a {
	color: var(--wp--preset--color--norlon-red, #DE3412) !important;
}
/* Homepage (transparent header): nav STAYS white on hover — only the red bar
   appears. Kadence's default hover turns it ink, so force white back. */
body.transparent-header #masthead .main-navigation li.menu-item > a:hover,
body.transparent-header #masthead .main-navigation li.menu-item > a:focus-visible {
	color: #fff !important;
}
/* Inner pages (solid header): link text darkens to black on hover, on top of the
   red bar. */
body:not(.transparent-header) #masthead .main-navigation li.menu-item > a { transition: color .2s ease; }
body:not(.transparent-header) #masthead .main-navigation li.menu-item > a:hover,
body:not(.transparent-header) #masthead .main-navigation li.menu-item > a:focus-visible {
	color: #000 !important;
}
@media (prefers-reduced-motion: reduce) {
	#masthead .main-navigation li.menu-item > a::after,
	.norlon-slider-learn .arrow, .wp-block-button__link, .wp-element-button { transition: none; }
}

/* ---- precise typography corrections (exact spec values) ---- */
/* Button (exact, global-components.md §4): Button Red fill, Montserrat Bold 11 /
   LH 15 / tracking 0.09em / UPPERCASE white, SQUARE (0 radius), ~42px tall,
   ~26px side padding, no border/shadow. Kadence's default (18px, 3px radius)
   otherwise wins entirely, so force it. */
.wp-block-button__link, .wp-element-button {
	background-color: var(--wp--preset--color--button-red, #E73613) !important;
	color: #fff !important;
	font-family: "Montserrat", sans-serif !important;
	font-weight: 700 !important;
	font-size: 11px !important;
	line-height: 15px !important;
	letter-spacing: 0.09em !important;
	text-transform: uppercase !important;
	border: 0 !important;
	border-radius: 0 !important;
	padding: 13px 26px !important;
	box-shadow: none !important;
	transition: background-color .22s ease;
}
/* Hover: fill fades from Button-red to near-black (design spec). Text stays white. */
.wp-block-button__link:hover, .wp-element-button:hover,
.wp-block-button__link:focus-visible, .wp-element-button:focus-visible { background-color: var(--wp--preset--color--ink, #231F20) !important; }
/* On DARK stripes the fill inverts instead: WHITE background + ink text (design). */
.norlon-connect .wp-block-button__link:hover, .norlon-connect .wp-element-button:hover,
.norlon-connect .wp-block-button__link:focus-visible, .norlon-connect .wp-element-button:focus-visible,
.norlon-50th .wp-block-button__link:hover, .norlon-50th .wp-element-button:hover,
.norlon-50th .wp-block-button__link:focus-visible, .norlon-50th .wp-element-button:focus-visible,
.norlon-vision .wp-block-button__link:hover, .norlon-vision .wp-element-button:hover,
.norlon-vision .wp-block-button__link:focus-visible, .norlon-vision .wp-element-button:focus-visible,
.norlon-contact .gform_wrapper .gform_footer input[type="submit"]:hover,
.norlon-contact .gform_wrapper .gform_footer input[type="submit"]:focus-visible,
.norlon-contact .gform_wrapper .gform_footer button:hover,
.norlon-contact .gform_wrapper .gform_footer button:focus-visible {
	background: #fff !important; background-color: #fff !important; color: var(--wp--preset--color--ink, #231F20) !important;
}
/* Eyebrows/labels: Montserrat ExtraBold 11 / LH 15px / 0.15em (exact) */
.has-eyebrow-font-size { line-height: 15px !important; }

/* ---- shared section rhythm (tighter, matches design) ---- */
.norlon-sec { padding-block: 60px !important; }
.norlon-sec-sm { padding-block: 40px !important; }
/* Stripes butt up against each other in R2 — no white gaps between them. The
   vertical rhythm lives entirely in each stripe's own padding. */
.norlon-intro, .norlon-50th, .norlon-recent, .norlon-quote,
.norlon-teaser, .norlon-connect, .norlon-hero-wrap { margin-block: 0 !important; }

/* inner-page hero: full-width landscape band inset to content width */
/* Canonical inner-page hero — one definition, used by every interior page + the
   Projects listing (projects.css no longer redefines it). Height via --nr-hero-h. */
.norlon-pagehero { padding-block: 0 !important; margin-block: 0 !important; }
.norlon-page-hero { margin: 0 auto; }
.norlon-page-hero img { width: 100%; height: var(--nr-hero-h); object-fit: cover; display: block; }
@media (max-width: 767px) { .norlon-page-hero img { height: 240px; } }

/* ============= INNER-PAGE SHARED PATTERNS (R2) ============= */
/* Page-title intro: 64px red title (right-aligned) + copy beside, centred block.
   R2: 46px above the heading, 58px below the copy to the next stripe. */
.norlon-pageintro { padding-block: 46px 58px !important; }
/* Generic: heading shrinks to the title; the copy column carries its own width
   (set per page in the block, since R2 varies it: About 262, Services 596…). The
   row is centred via fit-content + auto margins. */
/* Centre the heading+copy as a group (justify-content), keeping the row at the
   container width — NOT fit-content, which collapses the copy column to one word
   per line. Heading shrinks to its title; copy keeps its block flex-basis. */
.norlon-pageintro-row { justify-content: center; gap: 46px; align-items: flex-start !important; flex-wrap: nowrap; }
/* flex-shrink:0 is load-bearing (WP columns default to shrink:1, which collapsed
   the copy column to one word per line). The heading column is a fixed 210px —
   `flex:0 0 auto` let it balloon to full width and shove the copy off-screen; the
   64px page titles ("About Us", "Services"…) are ~205px, so 210 right-aligns them
   cleanly. */
.norlon-pageintro-row > .wp-block-column { align-self: flex-start !important; flex-shrink: 0 !important; }
/* Heading column is 210px for short titles but grows for long ones ("Plans Rooms")
   so the nowrap heading never overflows into the copy. width:max-content shrink-wraps
   the heading (a bare flex:auto on the flow column would fill the whole row). */
.norlon-pageintro-row > .wp-block-column:first-child { flex: 0 0 auto !important; width: max-content !important; min-width: 210px; }
.norlon-pageintro h1 { margin: 0; line-height: 1; text-align: right; white-space: nowrap; }
.norlon-pageintro p { margin: 0; }

/* Company History — gray, copy left, image right (R2 img 579x314) */
.norlon-history { padding-block: 60px !important; }
.norlon-history-row { align-items: flex-start; gap: 48px; }
.norlon-history h2 { margin: 0 0 20px; }
.norlon-history-img { margin: 0; }
.norlon-history-img img { width: 100%; aspect-ratio: 579/314; object-fit: cover; display: block; }

/* Our Vision — dark + blueprint texture; eyebrow + 64px statement (red emphasis) */
.norlon-vision { position: relative; overflow: hidden; background-color: var(--nr-ink) !important; padding-block: 70px 78px !important; }
.norlon-vision::before { content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none; background-image: var(--nr-texture); background-size: cover; background-position: center; }
/* R2-measured (208:1245): the Vision block is 971px wide, centred (x=231..1201) —
   our 1000px never applied (computed 1160, out-specified by the content-width rule),
   so the statement ran the full 1160. !important + the measured 971. */
.norlon-vision > * { position: relative; z-index: 1; max-width: 971px !important; margin-inline: auto; }
.norlon-vision .has-eyebrow-font-size { margin: 0 0 18px; }
/* Scoped to the parent on purpose: the statement is an <h2>, and Kadence's
   `.entry-content h2 { margin-top: 96px }` (0,1,1) beat a bare `.norlon-vision-text`
   (0,1,0) — that 96px (collapsing over the eyebrow's 18px) made the stripe 541 vs
   R2's 490. Same specificity trap as `.single-content form`. */
/* R2-measured: statement line pitch is 77px on the 64px font → line-height 1.2
   (we had 1.1 = 70.4px). NB only 3 of its 4 lines read as "white" — line 4 is the
   red italic clause. */
.norlon-vision .norlon-vision-text { font-weight: 600; font-size: 64px; line-height: 1.2; letter-spacing: 0; margin: 0; }
/* Emphasis red on the dark ink Vision stripe. --nr-signal (#EF4135) is 4.25:1 here —
   it clears AA as LARGE text (64/40px, 3:1) so axe passes it, but strict-4.5 tools
   flag it. --nr-red-on-dark (#F4553F) is 4.83:1, passing at the small-text threshold
   too, so it's unambiguous across tools. Negligible visual change. */
.norlon-vision-text em { font-style: normal; color: var(--nr-red-on-dark); }

/* SYSTEMIC: red PRESET text (block colour picker: Signal Red #EF4135 / Norlon Red
   #DE3412) sitting on the dark blueprint stripes fails strict 4.5:1 as small text
   (signal 4.25, brand 3.58 on ink). Remap both to the AA-safe dark red (4.83) on
   those stripes only — light-stripe uses of the same preset colours are untouched.
   Catches the "OUR VISION" eyebrow and the 50th "1976 – 2026" date; contact's reds
   are already handled explicitly above. `.has-*-color` presets carry !important, so
   these must too. */
.norlon-vision .has-signal-red-color,
.norlon-vision .has-norlon-red-color,
.norlon-50th .has-signal-red-color,
.norlon-50th .has-norlon-red-color,
.norlon-connect .has-signal-red-color,
.norlon-connect .has-norlon-red-color { color: var(--nr-red-on-dark) !important; }

/* Trusted Partners — heading | copy | logo, vertically centred */
/* R2-measured (About 208:1245): Trusted Partners stripe = 267px, ink 65 top / 67
   bottom. Shared with Services' Safety stripe (.norlon-safety.norlon-partners) so
   both stay identical — one value, both pages. */
.norlon-partners { padding-block: 65px 67px !important; }
.norlon-partners-row { align-items: center; gap: 40px; }
.norlon-partners h2 { margin: 0; }
.norlon-partner-logo { margin: 0; }
.norlon-partner-logo img { width: 135px; height: 135px; object-fit: contain; }
.norlon-partner-logo.norlon-cor img { width: 194px !important; height: auto; }
/* inner-page stripes butt together (no default block gaps); rhythm is per-stripe */
.norlon-pagehero, .norlon-pageintro, .norlon-svctabs-stripe, .norlon-why,
.norlon-divider-wrap, .norlon-safety, .norlon-sectors, .norlon-history,
.norlon-vision, .norlon-partners, .norlon-contact { margin-block: 0 !important; }

/* SYSTEMIC (R2-measured): a stripe's vertical rhythm is its OWN padding — never a
   block's default margin. WP adds a trailing 32px margin-bottom to the stripe's last
   block (.wp-block-columns), which leaked into stripe heights (Connect +45, Company
   History +36). Zero ONLY that TRAILING margin.
   Deliberately scoped to `> *:last-child`: an earlier, broader version zeroed EVERY
   columns margin inside a stripe and silently destroyed intentional gaps — e.g. the
   51px under .norlon-sectors-head (tiles jumped 51px up) and .norlon-advantages'
   44px margin-top. Intentional spacing between a stripe's head and its content must
   survive; only the trailing leak goes. */
.norlon-pageintro > *:last-child,
.norlon-history > *:last-child,
.norlon-vision > *:last-child,
.norlon-partners > *:last-child,
.norlon-why > *:last-child,
.norlon-sectors > *:last-child,
.norlon-safety > *:last-child,
.norlon-contact > *:last-child,
.norlon-svctabs-stripe > *:last-child { margin-bottom: 0 !important; }
/* R2-measured (page frames @1:1): the hero band starts at y=151 — exactly the
   header's bottom edge, i.e. NO gap. The old 26px was derived back when the header
   was mis-sized at 104; with the header now its true 151, the gap must be 0. */
body:not(.home) .content-area { margin-top: 0 !important; }

/* ---- Services: "Explore Our Services" tabbed component (R2) ----
   R2 internal rhythm: 46 top → heading → 46 → tabs → 10 → divider → 55 → content
   (centred) → 76 bottom.
   The heading and the tabs are now SIBLINGS inside the stripe (the heading is a real
   core/heading block the client owns; it used to be printed by the shortcode). So
   the stripe carries the 46/76 padding — it used to sit on .norlon-svctabs back when
   that wrapper contained both. */
.norlon-svctabs-stripe { padding-block: 46px 76px !important; }
.norlon-svctabs { padding: 0; }
/* Scoped: Kadence's `.entry-content h2 { margin-bottom: 25px }` (0,1,1) beats a bare
   class (0,1,0), so this must stay at (0,2,0) or the 46px silently reverts to 25. */
.norlon-svctabs-stripe > .norlon-svctabs-head { margin: 0 0 46px; }
/* ---- Tab chrome: RE-SKIN of the kadence/tabs block ----
   The service copy now lives in the PAGE as blocks (kadence/tabs > kadence/tab >
   core/columns), so the client edits it in the editor — it used to be hardcoded in
   a PHP array and was uneditable. Kadence owns the chrome markup, the ARIA
   (tablist/tab/tabpanel) and the JS; we only re-skin it to R2.
   Selectors therefore target KADENCE's classes. Do not reintroduce .norlon-svctab —
   that markup no longer exists. Note the active class sits on the <li>
   (.kt-tab-title-active), while the styled element is the <a> inside it.

   R2 measured: tab label → 3px red underline (~5px below the label) → 28px →
   2px #D9D9D9 hairline. i.e. ~33px of air under the label, and the underline is a
   SEPARATE line above the hairline (not sitting on it). */
/* padding-bottom needs !important: Kadence's own style-blocks-tabs.css ships
   `.wp-block-kadence-tabs .kt-tabs-title-list{padding:0}` at the SAME (0,2,0)
   weight and loads after sections.css, so it wins on source order (gotcha B24). */
.norlon-svctabs .kt-tabs-title-list {
	display: flex; flex-wrap: nowrap; justify-content: space-between; gap: 24px;
	margin: 0; padding: 0 0 30px !important; list-style: none;
	border-bottom: var(--nr-divider-w) solid var(--nr-divider-color);
}
.norlon-svctabs .kt-title-item { margin: 0; padding: 0; }
/* !important throughout: Kadence ships per-block inline CSS for this block id
   (.kt-tabs-id39_svctabs …) which is emitted AFTER sections.css. */
.norlon-svctabs .kt-tab-title {
	background: none !important; box-shadow: none !important; border: 0 !important;
	padding: 0 0 8px !important; text-decoration: none !important;
	font-family: var(--nr-mont); font-weight: 700; font-size: 11px; line-height: 1;
	letter-spacing: 0.09em; text-transform: uppercase; color: var(--nr-ink) !important;
	cursor: pointer; position: relative; white-space: nowrap; transition: color .18s ease;
}
/* Active AND hover share the same red treatment (R2). The label uses the AA-safe
   deeper red — 11px on the #F0F0F0 panel needs 4.5:1 and brand red is only 4.0
   there (see --nr-red-on-light). The 3px underline keeps the BRAND red: it is a
   non-text UI affordance, so the 4.5:1 text rule doesn't apply to it. */
.norlon-svctabs .kt-tab-title-active .kt-tab-title,
.norlon-svctabs .kt-tab-title:hover { color: var(--nr-red-on-light) !important; font-weight: 800; }
.norlon-svctabs .kt-tab-title-active .kt-tab-title::after,
.norlon-svctabs .kt-tab-title:hover::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: var(--nr-underline-w); background: var(--nr-red); }
.norlon-svctabs .kt-tab-title:focus-visible { outline: 2px solid var(--nr-red); outline-offset: 3px; }
/* Kadence's default panel is a 1px #dee2e6 box with 20px padding — R2 has neither. */
.norlon-svctabs .kt-tabs-content-wrap { border: 0 !important; background: none !important; }
.norlon-svctabs .wp-block-kadence-tab { padding: 0 !important; border: 0 !important; background: none !important; }
/* R2: the copy block and image are vertically CENTRED against each other. */
/* R2-measured (tab component 217:2994 @1:1): the panel sits 36px below the hairline
   and is laid out ~53 indent + 450 text + 77 gap + 580 photo = 1160. The photo is a
   FIXED 580 wide (->314 tall at its 580/314 aspect); ours flexed to 638 (->345 tall),
   which was the entire +24 on the Explore stripe. Copy + photo vertically centred. */
/* Vertical alignment and the 450/580 column widths are NOT set here — they are the
   core/columns block's own `verticalAlignment` and core/column `width` attributes,
   set in the editor. That is deliberate on two counts: the client can adjust them
   with block controls, and CSS could not win anyway — core ships
   `.wp-block-columns{align-items:normal!important}` and
   `.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block{flex-basis:0}`, which
   out-rank a plain class. (Value-Added is top-aligned, the rest centred — R2.) */
/* margin-top !important: Kadence's `.single-content .wp-block-columns{margin-top:0}`
   (0,2,0) beats this class, so the panel sat flush against the hairline (R2 = 36).
   margin-bottom 0: the panel is the last block inside its tab pane, so WP's 32px
   block-gap leaked out and inflated the stripe (gotcha B21). The stripe's existing
   `> *:last-child` reset can't reach it — that only catches the stripe's DIRECT
   last child (the tabs wrapper), not a block nested inside the pane. */
.norlon-svcpanel { display: flex; gap: 77px; padding-left: 53px; margin-top: 36px !important; margin-bottom: 0 !important; }
/* The BLOCK still owns the value — these classes ARE the verticalAlignment
   attribute. They need !important only because core ships
   `.wp-block-columns{align-items:normal!important}`, which otherwise defeats the
   block's own setting. Editing the alignment in the editor still works. */
.norlon-svcpanel.are-vertically-aligned-center { align-items: center !important; }
.norlon-svcpanel.are-vertically-aligned-top { align-items: flex-start !important; }
/* Targeted by ELEMENT, not a class: these are ordinary core/heading blocks the
   client owns now, and a className is the first thing lost when someone retypes a
   heading. The structure (a h3 inside the text column) is the stable contract. */
.norlon-svcpanel-text > h3 { font-family: var(--nr-din); font-weight: 700; font-size: 30px; line-height: 1; letter-spacing: 0.05em; text-transform: uppercase; color: var(--nr-ink); margin: 0 0 16px; }
.norlon-svcpanel-text p { font-family: "Open Sans", sans-serif; font-weight: 500; font-size: 14px; line-height: 1.5; color: var(--nr-ink); margin: 0; }
.norlon-svcpanel-text p + p { margin-top: 21px; }
/* width comes from the core/column block attribute — see .norlon-svcpanel above */
.norlon-svcpanel-img img { width: 100%; aspect-ratio: 580/314; object-fit: cover; display: block; }

/* Value-Added tab — "Key Value-Added Services" list (R2). Red eyebrow uses the
   AA-safe deeper red (11px on the #F0F0F0 panel); bullets are small ink dots. */
.norlon-svcpanel-keylist { flex: 1 1 auto; }
.norlon-svcpanel-keylist > h4 { font-family: var(--nr-mont); font-weight: 800; font-size: 11px; line-height: 15px; letter-spacing: 0.15em; text-transform: uppercase; color: var(--nr-red-on-light); margin: 0 0 20px; }
/* !important on padding: Kadence's `.single-content ul{padding-left:2em}` ties this
   selector's (0,1,1) and loads later, indenting the list 28px past the R2 position. */
.norlon-svcpanel-keylist ul { margin: 0; padding: 0 !important; list-style: none; }
.norlon-svcpanel-keylist li { position: relative; padding-left: 20px; margin: 0 0 20px; font-family: "Open Sans", sans-serif; font-weight: 500; font-size: 14px; line-height: 1.5; color: var(--nr-ink); }
.norlon-svcpanel-keylist li:last-child { margin-bottom: 0; }
.norlon-svcpanel-keylist li::before { content: ""; position: absolute; left: 4px; top: 8px; width: 5px; height: 5px; border-radius: 50%; background: var(--nr-ink); }
.norlon-svcpanel-keylist li strong { font-weight: 700; }

/* ---- Services: Why Norlon (3 advantage cards) ---- */
.norlon-why { padding-block: 56px 60px !important; }
/* R2: heading + narrow copy clustered LEFT (copy ~214px), not a wide spread. */
.norlon-why-head { justify-content: flex-start; gap: 26px; align-items: baseline; }
.norlon-why-head > .wp-block-column:first-child { flex: 0 0 210px !important; }
.norlon-why-head > .wp-block-column:last-child { flex: 0 0 214px !important; }
.norlon-why h2 { margin: 0; white-space: nowrap; }
.norlon-advantages { gap: 40px !important; margin-top: 44px; align-items: flex-start; }
.norlon-advantages > .norlon-advantage { flex: 1 1 0; }
/* R2: UPPERCASE, base ink, one word red (the .nr-red span). */
/* Scoped: Kadence's `.entry-content h3 { margin-top: 45px }` (0,1,1) was beating a
   bare `.norlon-advantage-title` (0,1,0), pushing these titles 23px low. */
.norlon-advantage .norlon-advantage-title { font-family: var(--nr-din); font-weight: 700; font-size: 30px; line-height: 1; letter-spacing: 0.05em; text-transform: uppercase; color: var(--nr-ink); margin: 22px 0 14px; }
.norlon-advantage-title .nr-red { color: var(--nr-red); }
.norlon-advantage p { font-family: "Open Sans", sans-serif; font-weight: 500; font-size: 14px; line-height: 1.5; margin: 0; }
/* R2: each icon sits in a 149×149 #D9D9D9 badge, icon at natural size, left of column. */
.norlon-advantage .norlon-icon { width: 149px; height: 149px; margin: 0; background: var(--wp--preset--color--hairline-gray, #D9D9D9); display: flex; align-items: center; justify-content: center; }
.norlon-advantage .norlon-icon img { width: auto !important; height: auto !important; max-width: 106px; max-height: 100px; }

/* shared icon reset */
.norlon-icon { margin: 0; }

/* ============= CANONICAL CONTENT-WIDTH DIVIDER =============
   ONE divider used site-wide (Services, Contact, Plans, Projects, single). The
   line's weight/colour/width live in the --nr-divider-* vars above, so changing
   thickness or colour is a one-line edit that every page inherits. Spacing around
   a divider is contextual → left to each block's own margin, not baked in here.
   Modifiers:  .is-red  = signal-red line (e.g. Contact "Reach Out")
               .is-column = fills its container instead of capping at content width
   The doubled class + !important beat the core wp-block-separator defaults (which
   otherwise render a short, centred rule). */
.norlon-divider-wrap { padding-block: 0 !important; }
.norlon-divider.norlon-divider {
	border: 0;
	border-top: var(--nr-divider-w) solid var(--nr-divider-color);
	margin: 0 auto;
	width: 100% !important;
	max-width: var(--nr-cw) !important;
	opacity: 1;
	background: none;
}
.norlon-divider.is-red { border-top-color: var(--nr-divider-red); }
.norlon-divider.is-column { max-width: none !important; }

/* ---- Services: Industry Sectors (7 icon tiles, gray) ---- */
/* R2 (Services 208:925): stripe 394px, ink 61 top / 79 bottom, tiles start 157px
   down (= 56 pad + ~50 head + the 51px .norlon-sectors-head gap). Bottom padding was
   66 and left 101px of ink-gap vs R2's 79 → 44. */
.norlon-sectors { padding-block: 56px 44px !important; }
.norlon-sectors-head { max-width: 790px; margin-inline: 0 !important; margin-bottom: 51px !important; gap: 34px; align-items: baseline; }
.norlon-sectors-head > .wp-block-column:first-child { flex: 0 0 283px !important; }
.norlon-sectors-head > .wp-block-column:last-child { flex: 0 0 473px !important; }
.norlon-sectors h2 { margin: 0; }
/* R2: 7 tiles, each a 133×133 #D9D9D9 card with icon at natural size; label left, below. */
.norlon-sector-grid { display: flex; justify-content: space-between; gap: 8px; margin-top: 0; margin-bottom: 0 !important; align-items: flex-start; }
.norlon-sector { flex: 0 0 133px; min-width: 0; text-align: left; }
.norlon-sector .norlon-icon { width: 133px; height: 133px; margin: 0 0 12px !important; background: var(--wp--preset--color--hairline-gray, #D9D9D9); display: flex; align-items: center; justify-content: center; }
.norlon-sector .norlon-icon img { width: auto !important; height: auto !important; max-width: 107px; max-height: 92px; }
.norlon-sector-label { font-family: var(--nr-din); font-weight: 700; font-size: 16px; line-height: 1.1; letter-spacing: 0.03em; text-transform: uppercase; color: var(--nr-ink); text-align: left; margin: 0 !important; }

/* ============= CONTACT (dark "Reach Out" stripe) ============= */
.norlon-contact { position: relative; background-color: var(--nr-ink) !important; padding-block: 56px 62px !important; }
/* Section heading on a dark stripe — global h2 (50/600/48); colour comes from the block. */
.norlon-contact-head { margin: 0 0 22px; }
/* Divider is now the canonical .norlon-divider.is-red; only its contextual 40px
   bottom gap is scoped here (spacing is per-placement, the line is shared). */
.norlon-contact .norlon-divider { margin-bottom: 40px; }
.norlon-contact-row { gap: 50px; align-items: flex-start; }
.norlon-contact-col-map { display: flex; flex-direction: column; }
.norlon-contact-map { margin: 0; }
.norlon-contact-map img { width: 100%; aspect-ratio: 533/504; object-fit: cover; display: block; }
.norlon-contact-addr { font-family: var(--nr-mont); font-weight: 700; font-size: 13px; line-height: 1.75; letter-spacing: 0.04em; text-transform: uppercase; color: #fff; margin: 18px 0 0; }
/* 13px on the dark ink Contact stripe — brand red is only 3.58:1 there, so this
   needs the LIGHTER red, not the darker one used on the gray stripes. */
.norlon-contact-addr .tline { color: var(--nr-red-on-dark); }
/* Gravity Forms' "(Required)" marker, 12px, also on the dark Contact stripe.
   Scoped to .norlon-contact so forms on light backgrounds keep the brand red. */
.norlon-contact .gform_wrapper .gfield_required,
.norlon-contact .gform_wrapper .gfield_required_text { color: var(--nr-red-on-dark) !important; }

/* Contact + Plans form fields (Gravity Forms) — R2 look */
.norlon-contact .gform_wrapper .gfield_label,
.norlon-plans-form .gform_wrapper .gfield_label {
	font-family: var(--nr-mont); font-weight: 800; font-size: 11px; letter-spacing: 0.15em; text-transform: uppercase; margin: 0 0 8px;
}
.norlon-contact .gform_wrapper .gfield_label { color: #fff; }
.norlon-contact .gform_wrapper input, .norlon-contact .gform_wrapper select, .norlon-contact .gform_wrapper textarea {
	background: #535353 !important; border: 0 !important; border-radius: 0 !important; color: #fff !important;
	min-height: 44px; padding: 0 16px; font-family: "Open Sans", sans-serif; font-size: 14px;
}
.norlon-contact .gform_wrapper textarea { padding: 12px 16px; min-height: 171px; }
.norlon-contact .gform_wrapper ::placeholder { color: #aeaeae !important; opacity: 1; }
.norlon-plans-form .gform_wrapper input, .norlon-plans-form .gform_wrapper select {
	background: var(--wp--preset--color--field-gray-light, #F0F0F0) !important; border: 0 !important; border-radius: 0 !important;
	color: var(--nr-ink) !important; min-height: 44px; padding: 0 16px; font-family: "Open Sans", sans-serif; font-size: 14px;
}
.norlon-plans-form .gform_wrapper .gfield_label { color: var(--nr-ink); }
.norlon-plans-form .gform_wrapper ::placeholder { color: var(--wp--preset--color--placeholder-dark, #898989) !important; opacity: 1; }
/* Unified dropdown affordance across every form (Contact, Plans, Projects filter):
   a 45px #DE3412 square on the right with a centred white chevron (R2 spec). */
.norlon-contact .gform_wrapper select,
.norlon-plans-form .gform_wrapper select,
.norlon-select {
	appearance: none !important; -webkit-appearance: none !important;
	/* Chevron layer listed FIRST so it paints on top of the red square. */
	background-image:
		url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9'%3E%3Cpath fill='%23fff' d='M7 9 0 2 2 0l5 5 5-5 2 2z'/%3E%3C/svg%3E"),
		linear-gradient(var(--nr-red), var(--nr-red)) !important;
	background-repeat: no-repeat, no-repeat !important;
	background-position: right 15px center, right center !important;
	background-size: 14px 9px, 45px 100% !important;
	padding-right: 61px !important;
}
/* Open <option> list legibility + site-red highlight. Chrome renders options using
   the select's (dark) background with the system text colour → dark-on-dark and
   unreadable. Force a white list with ink text; selected/highlighted option = red +
   white text. The linear-gradient forces the fill in Blink where background-color on a
   highlighted option is otherwise ignored. */
.norlon-contact .gform_wrapper select option,
.norlon-plans-form .gform_wrapper select option,
.norlon-select option {
	background-color: #fff; color: var(--nr-ink, #231F20);
}
.norlon-contact .gform_wrapper select option:checked,
.norlon-contact .gform_wrapper select option:hover,
.norlon-contact .gform_wrapper select option:focus,
.norlon-plans-form .gform_wrapper select option:checked,
.norlon-plans-form .gform_wrapper select option:hover,
.norlon-plans-form .gform_wrapper select option:focus,
.norlon-select option:checked,
.norlon-select option:hover,
.norlon-select option:focus {
	background: var(--nr-red) linear-gradient(0deg, var(--nr-red), var(--nr-red)) !important;
	color: #fff !important;
}
/* Custom dropdown (assets/select.js) — styled option list with a site-red hover that
   a native <select> popup can't render. The trigger mirrors the field; the native
   <select> stays in the DOM (visually hidden) so submission/validation still work. */
.norlon-dd { position: relative; }
.norlon-dd-native { position: absolute !important; width: 1px !important; height: 1px !important; margin: -1px !important; padding: 0 !important; border: 0 !important; overflow: hidden !important; clip: rect(0 0 0 0) !important; }
/* !important throughout — Gravity Forms styles every <button> in the form and would
   otherwise turn this trigger into a default GF button. */
.norlon-dd-trigger {
	position: relative !important; display: block !important; width: 100% !important; box-sizing: border-box !important;
	text-align: left !important; border: 0 !important; border-radius: 0 !important; box-shadow: none !important; cursor: pointer;
	min-height: 44px !important; padding: 0 61px 0 16px !important; margin: 0 !important;
	font-family: "Open Sans", sans-serif !important; font-size: 14px !important; font-weight: 400 !important; line-height: 44px !important;
	text-transform: none !important; letter-spacing: normal !important;
	background-image:
		url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9'%3E%3Cpath fill='%23fff' d='M7 9 0 2 2 0l5 5 5-5 2 2z'/%3E%3C/svg%3E"),
		linear-gradient(var(--nr-red), var(--nr-red)) !important;
	background-repeat: no-repeat, no-repeat !important;
	background-position: right 15px center, right center !important;
	background-size: 14px 9px, 45px 100% !important;
}
.norlon-dd-trigger:focus-visible { outline: 2px solid var(--nr-signal) !important; outline-offset: 2px; }
.norlon-contact .norlon-dd-trigger { background-color: #535353 !important; color: #fff !important; }
.norlon-plans-form .norlon-dd-trigger,
.norlon-filter .norlon-dd-trigger { background-color: var(--wp--preset--color--field-gray-light, #F0F0F0) !important; color: var(--nr-ink) !important; }
.norlon-filter .norlon-dd-trigger { min-height: 48px !important; line-height: 48px !important; }
/* !important — GF styles ul/li inside the form and would blank out the list bg. */
.norlon-dd-list {
	position: absolute !important; left: 0; right: 0; top: calc(100% + 2px); z-index: 60;
	margin: 0 !important; padding: 6px 0 !important; list-style: none !important; background: #fff !important;
	box-shadow: 0 10px 30px rgba(0,0,0,.22) !important; max-height: 300px; overflow-y: auto; width: auto !important;
}
.norlon-dd-list:focus { outline: none; }
.norlon-dd-option {
	padding: 11px 16px !important; margin: 0 !important; list-style: none !important; border: 0 !important;
	font-family: "Open Sans", sans-serif !important; font-size: 14px !important; font-weight: 400 !important;
	color: var(--nr-ink) !important; background: transparent !important; cursor: pointer !important;
}
.norlon-dd-option.is-selected { font-weight: 700 !important; }
.norlon-dd-option.is-active { background: var(--nr-red) !important; color: #fff !important; }

/* red square submit */
.norlon-contact .gform_wrapper .gform_footer input[type="submit"],
.norlon-plans-form .gform_wrapper .gform_footer input[type="submit"] {
	background: var(--wp--preset--color--button-red, #E73613) !important; color: #fff !important; min-height: 42px; width: auto; min-width: 130px;
	font-family: var(--nr-mont); font-weight: 700; font-size: 11px; letter-spacing: 0.09em; text-transform: uppercase; padding: 0 26px;
	transition: background-color .22s ease;
}
/* Plans form is on a LIGHT background → hover fades to ink (like other site buttons).
   The Contact form is on the DARK Reach Out stripe → it inverts to white (rule above). */
.norlon-plans-form .gform_wrapper .gform_footer input[type="submit"]:hover,
.norlon-plans-form .gform_wrapper .gform_footer input[type="submit"]:focus-visible {
	background: var(--wp--preset--color--ink, #231F20) !important;
}

/* Plans Rooms: login form + red terms line (R2: Open Sans Medium Italic 500). */
/* R2 renders the phone red AND bold (we had 500 = regular body weight). */
.norlon-plans .nr-red { color: var(--nr-red); font-weight: 700; }
.norlon-plans .norlon-pageintro-row p { margin-bottom: 0 !important; } /* kill Kadence's 32px block gap so the terms margin wins */
.norlon-plans-terms { margin: 21px 0 0 !important; }   /* R2: ~one blank line after the paragraph */
.norlon-plans-terms em { color: var(--nr-red); font-style: italic; font-weight: 500; }
.norlon-plans-form { margin-top: 0 !important; }        /* gap to form is on the divider below */
/* Divider is now the canonical .norlon-divider.is-column (fills the copy column);
   only its contextual spacing (20px above from the terms, 30px below to the form)
   is scoped here. */
.norlon-plans .norlon-divider.is-column { margin: 20px 0 30px; }

@media (max-width: 900px) {
	/* MOBILE GUTTER (responsive.md: "Mobile ≤767px — content column with ~20–24px
	   side padding"). These stripes are alignfull groups using WP's constrained
	   layout, which caps the inner width at 1160 but adds NO horizontal padding — so
	   below 1160 the copy ran hard to both screen edges (measured L0 / R390).
	   .norlon-intro + .norlon-sectors are excluded: they already carry their own inset. */
	/* !important is required: Kadence's content.min.css ships
	   `.alignfull, .alignwide { padding-left: 0 }` — same (0,1,0) weight as these
	   classes — and wins on source order, so a plain rule computed to 0. */
	.norlon-pageintro, .norlon-why, .norlon-partners, .norlon-safety,
	.norlon-history, .norlon-vision, .norlon-contact, .norlon-connect,
	.norlon-recent, .norlon-teaser, .norlon-quote, .norlon-50th { padding-inline: 24px !important; }

	.norlon-contact-row { display: block; }
	.norlon-contact-map { margin-top: 30px; }
	.norlon-pageintro-row { flex-direction: column; align-items: flex-start !important; gap: 16px; }
	.norlon-pageintro-row > .wp-block-column:last-child { flex-basis: auto !important; width: auto !important; }
	.norlon-pageintro h1 { text-align: left; white-space: normal; }
	/* Qualified with .wp-block-columns to reach (0,2,0): WP core's
	   `.wp-block-columns { display:flex }` is (0,1,0) — the same weight as a bare
	   class — and was winning on source order, so these rows NEVER stacked. Their
	   columns kept their desktop flex-basis (e.g. sectors-head 283+473=790 inside a
	   330px viewport) and got silently clipped by `html{overflow-x:clip}`. */
	.wp-block-columns.norlon-history-row, .wp-block-columns.norlon-partners-row,
	.wp-block-columns.norlon-advantages, .wp-block-columns.norlon-why-head,
	.wp-block-columns.norlon-sectors-head { display: block; }
	.norlon-svcpanel { display: block; }
	/* …and release the fixed desktop column widths once stacked. */
	.norlon-why-head > .wp-block-column, .norlon-sectors-head > .wp-block-column,
	.norlon-history-row > .wp-block-column, .norlon-partners-row > .wp-block-column,
	.norlon-advantages > .wp-block-column { flex: 0 0 auto !important; width: auto !important; }
	/* Tabs were nowrap with no scroll container, so "Design-Build"/"Value-Added"
	   (scrollWidth 770 vs 330) were clipped and untappable. Wrap instead of scroll so
	   every tab stays visible and discoverable. */
	.norlon-svctabs-tabs { flex-wrap: wrap; justify-content: flex-start; gap: 16px 28px; }
	/* NOTE on !important throughout this group: sections.css is enqueued BEFORE
	   Kadence's global.min.css / content.min.css, so an equal-specificity rule of
	   ours LOSES on source order. Each rule below is beaten by a deliberate Kadence
	   reset at (0,2,0) vs our (0,1,0), so !important is the correct tool here.

	   Kadence's `.single-content .wp-block-image { margin-top: 0 }` (0,2,0) beat this
	   (0,1,0), so the image sat flush against the copy once the row stacked. */
	.norlon-history-img { margin-top: 24px !important; }
	/* Stacked, the heading sits directly on top of its copy. Kadence zeroes it via
	   `.single-content h2:last-child { margin-bottom: 0 }` (0,2,0) — which catches
	   this heading only because it is ALONE in its column (Company History has
	   paragraphs after it, so it escapes the reset and keeps Kadence's 0.5em = 14px).
	   Match that 14px so both stacked headings read identically. */
	.norlon-partners h2 { margin-bottom: 14px !important; }
	/* The logo is `alignright`, so once the row stacks its float takes it OUT of
	   flow: the column collapsed to 0 height and the logo spilled past the stripe's
	   padding into the dark band below it. Un-float it (back in flow, so the stripe
	   grows to contain it), centre it, and give it a gap above — the stripe's own
	   padding-bottom handles the space below. `display:table` + auto side margins is
	   what centres it. Beats `.alignright`'s float AND its margin-left. */
	.norlon-partner-logo { float: none !important; margin: 32px auto 0 !important; }
	/* The R2 desktop panel is inset 53px with fixed 450/580 columns — none of that
	   applies once it stacks, or the image is squeezed into ~277px and indented. */
	.norlon-svcpanel { padding-left: 0; }
	.norlon-svcpanel-text, .norlon-svcpanel-img, .norlon-svcpanel-keylist { flex: 1 1 auto; }
	.norlon-svcpanel-text { margin-bottom: 24px; }
	.norlon-vision .norlon-vision-text { font-size: 40px; }
	.norlon-advantages > .norlon-advantage { margin-bottom: 30px; }
	.norlon-sector-grid { flex-wrap: wrap; gap: 24px; }
	.norlon-sector { flex: 0 0 40%; }
}

/* eyebrow helper already inline; ensure red labels tight */

/* ================= HERO SLIDER ================= */
/* Only zero the vertical margins — keep alignfull's margin-inline breakout,
   otherwise the hero shifts right and leaves a white gap on the left. */
.norlon-hero-wrap { margin-top: 0 !important; margin-bottom: 0 !important; padding: 0 !important; }
.norlon-slider { position: relative; }
.norlon-slider-track { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; -ms-overflow-style: none; scrollbar-width: none; }
.norlon-slider-track::-webkit-scrollbar { display: none; height: 0; }
.norlon-slide { min-width: 100%; scroll-snap-align: start; }
/* Height tracks the viewport (design: 918/1304 = 70.4% of the browser height),
   NOT a fixed pixel height — that's what made it look short on a tall window. */
.norlon-slide img { width: 100%; height: 755px; object-fit: cover; display: block; }
/* TOP scrim — must be deep enough to sit under the whole header (logo bottom is
   at 95px) so the white nav stays legible on bright slides. */
.norlon-slider::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 300px; background: linear-gradient(to bottom, rgba(35,31,32,.78) 0%, rgba(35,31,32,.62) 22%, rgba(35,31,32,.34) 55%, rgba(35,31,32,0) 100%); pointer-events: none; z-index: 3; }
/* soft fade above the bottom bar so the transition isn't hard */
.norlon-slider::after { content: ""; position: absolute; left: 0; right: 0; bottom: 96px; height: 140px; background: linear-gradient(to top, rgba(35,31,32,.6), rgba(35,31,32,0)); pointer-events: none; z-index: 2; }
/* BOTTOM dark bar — 96px tall, inner content on the 1160 container */
.norlon-slider-bar { position: absolute; left: 0; right: 0; bottom: 0; background: rgba(35,31,32,.88); z-index: 4; }
/* No side padding: the name/dots must start exactly on the container edge (142px
   at 1440), and the arrow must end on it. Gutters only kick in below 1160. */
.norlon-slider-bar__inner { width: min(1160px, 100% - 48px); margin-inline: auto; padding: 0 15px 0 0; min-height: 96px; display: flex; justify-content: space-between; align-items: center; gap: 24px; }
/* Project name is DIN Condensed Bold ~15px / 0.04em — NOT Montserrat. */
/* Tracking is wide (0.115em): the design's DIN cut is wider than the supplied URW
   file, so at the matching 15px/11px-cap the name must be tracked out to reach the
   design's 328px line width. */
.norlon-slider-name { font-family: var(--nr-din); font-weight: 600; font-size: 16px; line-height: 21px; letter-spacing: 0.05em; text-transform: uppercase; color: #fff; margin: 0 0 16px !important; min-height: 1em; }
/* controls row: pause/play then the dots (design: 8px tall, on the 142px edge).
   margin-top:0 is load-bearing — a global block margin was collapsing into the
   name's margin-bottom and pinning the gap at 36px regardless of what we set. */
.norlon-slider-controls { display: flex; align-items: center; gap: 11px; margin-top: 0 !important; }
/* These are real <button>s, so Kadence's global button styles add a red fill +
   shadow on hover/focus/active — force them fully transparent in every state. */
.norlon-slider-play,
.norlon-slider-play:hover, .norlon-slider-play:focus, .norlon-slider-play:active {
	background: transparent !important; box-shadow: none !important;
}
.norlon-slider-play { width: 9px; height: 8px; padding: 0; border: 0; cursor: pointer; flex: none; position: relative; }
.norlon-slider-play::before, .norlon-slider-play::after { content: ""; position: absolute; top: 0; width: 2px; height: 8px; background: #fff; }
.norlon-slider-play::before { left: 0; }
.norlon-slider-play::after { left: 5px; }
/* paused -> show a single play triangle instead of the two bars */
.norlon-slider-play[aria-pressed="true"]::before { left: 0; top: 0; width: 0; height: 0; background: transparent; border-left: 8px solid #fff; border-top: 4px solid transparent; border-bottom: 4px solid transparent; }
.norlon-slider-play[aria-pressed="true"]::after { display: none; }
.norlon-slider-play:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }
/* dots are SQUARES in the design, not circles; active one is red */
.norlon-slider-dots { display: flex; gap: 10px; }
/* 7px squares, all the same size; the active one is just red (was 10px — too wide).
   !important + no shadow to override Kadence's global <button> styling. */
.norlon-slider-dot { width: 7px; height: 7px; border-radius: 0; border: 0; padding: 0; background: rgba(255,255,255,.9) !important; box-shadow: none !important; cursor: pointer; }
.norlon-slider-dot:hover { background: #fff !important; }
.norlon-slider-dot.is-active { background: var(--nr-signal) !important; }
.norlon-slider-dot:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
/* A long project title used to force the info column wide (flex items default to
   min-width:auto, so the title never wrapped) and squeeze the "learn about this
   project" label + arrow. min-width:0 lets the title WRAP; flex:none keeps the CTA
   at its natural size so it is always fully visible. */
.norlon-slider-info { flex: 1 1 auto; min-width: 0; }
.norlon-slider-name { overflow-wrap: anywhere; }
.norlon-slider-learn { display: inline-flex; align-items: center; gap: 16px; text-decoration: none; flex: none; }
/* 3 lines sized so the label block matches the 48px arrow square */
.norlon-slider-learn .lbl { font-family: var(--nr-mont); font-weight: 700; font-size: 12px; line-height: 16px; letter-spacing: 0.09em; text-transform: uppercase; color: #fff; text-align: right; }
/* Rest: red square, white arrow. Hover: inverts — a white fill wipes in from
   the left and the arrow turns red (design spec). */
.norlon-slider-learn .arrow { width: 48px; height: 48px; background-color: var(--nr-red); background-image: linear-gradient(#fff, #fff); background-repeat: no-repeat; background-position: left center; background-size: 0% 100%; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 20px; flex: none; transition: background-size .3s ease, color .2s ease; }
.norlon-slider-learn:hover .arrow, .norlon-slider-learn:focus-visible .arrow { background-size: 100% 100%; color: var(--nr-red); }
@media (max-width: 767px) {
	.norlon-slide img { height: 420px; }
	/* Phone: the bar's 24px content gutter + 15px inner padding cost the title 39px
	   of width, forcing long project names onto 3 lines. Take the CTA out to the
	   screen edge (12px) and hand the reclaimed width to the title instead. The
	   title keeps its 24px gutter so it still aligns with the copy below the hero.
	   .norlon-slider-info is flex:1 1 auto, so it absorbs all of it: 151px -> 186px. */
	.norlon-slider-bar__inner { width: 100%; margin-inline: 0; padding: 0 12px 0 24px; gap: 16px; }
	/* Even at 186px the titles still broke to 3 lines — measured thresholds are
	   202-214px, and the CTA's 152px is the only width left to reclaim. Below 767px
	   the label is dropped and the red arrow carries the affordance on its own,
	   taking the CTA 152px -> 48px and the title 186px -> 290px (every title now
	   fits 1-2 lines). Visually hidden rather than display:none — the arrow is
	   aria-hidden, so display:none would leave the link with NO accessible name.
	   This keeps "Learn about this project" as the link text for screen readers. */
	.norlon-slider-learn { position: relative; }
	.norlon-slider-learn .lbl {
		position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
		overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
	}
}

/* ================= HERO (legacy static) ================= */
.norlon-hero { min-height: 620px !important; }
.norlon-hero .wp-block-cover__inner-container { width: 100%; max-width: 1160px; margin-inline: auto; align-self: flex-end; padding-bottom: 34px; }
.norlon-herobar { display: flex; justify-content: space-between; align-items: flex-end; gap: 24px; }
.norlon-herobar .norlon-hero-name { font-family: var(--nr-mont); font-weight: 800; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #fff; margin: 0; }
/* carousel-style dots under the name (decorative on the static hero) */
.norlon-herobar .norlon-hero-name::after { content: ""; display: block; margin-top: 12px; width: 74px; height: 9px; background-image: radial-gradient(circle 4.5px at 4.5px 4.5px, var(--nr-signal) 0 4.5px, transparent 4.5px), radial-gradient(circle 4.5px at 4.5px 4.5px, rgba(255,255,255,.5) 0 4.5px, transparent 4.5px), radial-gradient(circle 4.5px at 4.5px 4.5px, rgba(255,255,255,.5) 0 4.5px, transparent 4.5px), radial-gradient(circle 4.5px at 4.5px 4.5px, rgba(255,255,255,.5) 0 4.5px, transparent 4.5px), radial-gradient(circle 4.5px at 4.5px 4.5px, rgba(255,255,255,.5) 0 4.5px, transparent 4.5px); background-position: 0 0, 17px 0, 34px 0, 51px 0, 68px 0; background-repeat: no-repeat; }
/* the "learn about this project" CTA is a real Button block, styled as label + red arrow square */
.wp-block-button.norlon-hero-learn .wp-block-button__link { background: transparent !important; color: #fff !important; padding: 0 !important; display: inline-flex; align-items: center; gap: 16px; font-family: var(--nr-mont); font-weight: 700; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; }
.wp-block-button.norlon-hero-learn .wp-block-button__link::after { content: "\2192"; width: 48px; height: 44px; background-color: var(--nr-red); background-image: linear-gradient(#fff, #fff); background-repeat: no-repeat; background-position: left center; background-size: 0% 100%; color: #fff; display: inline-flex; align-items: center; justify-content: center; font-size: 20px; transition: background-size .3s ease, color .2s ease; }
.wp-block-button.norlon-hero-learn .wp-block-button__link:hover::after { background-size: 100% 100%; color: var(--nr-red); }
/* gradient scrim at the bottom for legibility */
.norlon-hero .wp-block-cover__background { background: linear-gradient(to top, rgba(35,31,32,.85) 0%, rgba(35,31,32,.15) 34%, rgba(35,31,32,0) 55%) !important; opacity: 1 !important; }

/* ============= TWO-COL INTRO ============= */
/* heading left (big), body right, top aligned */
/* The intro content is a ~920px block centred INSIDE the 1160 container — it is
   deliberately narrower than the main content width (measured from the design).
   Heading is right-aligned; "Trusted" is red italic. */
.norlon-intro { padding-top: 56px !important; padding-bottom: 51px !important; }
/* R2: intro block is 1009px whose LEFT edge is at x=172 — i.e. 32px in from the
   1160 content edge (which is at 50vw − 580 on desktop). Because .norlon-intro is
   full-bleed, a plain margin-left is measured from the viewport, so it must be
   calc'd back to the content edge (+32). heading col 471 (right-aligned), 46px
   gap, copy col 492. */
.norlon-intro .wp-block-columns { align-items: flex-start; gap: 46px; max-width: 1009px !important; margin-left: max(24px, calc(50vw - 548px)) !important; margin-right: auto !important; }
.norlon-intro .wp-block-columns > .wp-block-column:first-child { flex: 0 0 471px !important; }
.norlon-intro .wp-block-columns > .wp-block-column:last-child { flex: 0 0 492px !important; }
/* Design heading measures cap 36px / line-pitch 59px. Its display face is ~7%
   wider per unit height than the supplied URW DIN Condensed Bold, so a little
   tracking is needed to reach the design's line width. */
.norlon-intro h2 { letter-spacing: 0; text-align: right; }
.norlon-intro h2 em { font-style: italic; color: var(--nr-red); }
.norlon-intro h1, .norlon-intro h2 { margin-top: 0; }
/* keep the phrase narrow so it wraps to 3 lines like the design */
.norlon-intro .wp-block-column p { margin-top: 6px; line-height: 1.33; }
@media (max-width: 900px) {
	/* BOTH columns must be released: the desktop rule pins the LAST column to
	   `flex: 0 0 492px !important`, and only the first was reset — so the intro copy
	   and its CTA stayed 492px wide inside a 390px viewport and were clipped by
	   `html{overflow-x:clip}` (silently, since the page never scrolled). */
	.norlon-intro .wp-block-columns { max-width: none; margin-left: 24px !important; margin-right: 24px !important; }
	.norlon-intro .wp-block-columns > .wp-block-column:first-child,
	.norlon-intro .wp-block-columns > .wp-block-column:last-child { flex: 1 1 100% !important; }
	.norlon-intro h2 { text-align: left; font-size: 36px; }
}

/* ============= 50TH STRIPE ============= */
/* R2 spec: 1440x333 stripe. Content block is logo(345) + 82px gap + text(373)
   = 800px, centred on the viewport. Logo runs x320-665, text x747-1120. */
.norlon-50th { min-height: 333px; padding-block: 57px 62px !important; }
.norlon-50th .wp-block-columns { align-items: center; gap: 82px; max-width: 800px; margin-inline: auto; }
.norlon-50th .wp-block-columns > .wp-block-column:first-child { flex: 0 0 345px !important; }
.norlon-50th .wp-block-columns > .wp-block-column:last-child { flex: 0 0 373px !important; }
.norlon-50th img { width: 345px; max-width: 100%; height: auto; }
/* "Celebrating 50 Years of Building Ontario" — DIN Cond Medium 36 / lh normal / 1% */
.norlon-50th h2 { margin: 0 0 18px; font-weight: 500; font-size: 36px; line-height: 1.18; letter-spacing: 0.01em; }
/* "1976 – 2026" — Montserrat Bold 14 / 15% / signal red (was 11px: too small) */
.norlon-50th .has-eyebrow-font-size { font-size: 14px !important; line-height: 17px !important; letter-spacing: 0.15em !important; }
.norlon-50th .norlon-eyebrow, .norlon-50th p:last-child { margin: 0; }

/* ---- shared dark-stripe blueprint texture (50 Years + Connect With Us) ----
   R2 composites the blueprint over #231F20 with a LINEAR_BURN blend. CSS has no
   linear-burn mode (and `multiply` washed the pattern out almost completely), so
   the linear-burn result is pre-baked into the image (--nr-texture) and used as a
   plain background — matching the design exactly and rendering identically across
   browsers. */
.norlon-50th, .norlon-connect { position: relative; overflow: hidden; background-color: var(--nr-ink) !important; }
.norlon-50th::before, .norlon-connect::before {
	content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
	background-image: var(--nr-texture); background-size: cover; background-position: center;
}
.norlon-50th > *, .norlon-connect > * { position: relative; z-index: 1; }

/* ============= RECENT PROJECTS (full-bleed slider) ============= */
/* Intro: heading clustered top-left with the copy + button beside it (not a
   full-width spread). */
/* R2: heading + copy + button all sit LEFT, together 745px of the 1160 content
   column (~64%). Heading col 310px, copy col 435px, both flush left. */
/* R2: the gray continues ~110px BELOW the scroll indicator, and the quote mark
   from the next stripe bleeds up into that gray. */
.norlon-recent { background-color: #F0F0F0 !important; padding-block: 60px 110px !important; overflow: visible; }
/* Keep the block on the 1160 content column (so it starts at the 140px edge) and
   let the two fixed columns fill only 745px of it — that leaves the right ~36%
   empty, exactly as R2 has it. Don't shrink the block itself: WP's constrained
   layout puts max-width on the child, so overriding it loses the 140px inset. */
.norlon-recent .wp-block-columns { gap: 0; align-items: flex-start; justify-content: flex-start; }
.norlon-recent .wp-block-columns > .wp-block-column:first-child { flex: 0 0 310px !important; }
.norlon-recent .wp-block-columns > .wp-block-column:last-child { flex: 0 0 435px !important; }
.norlon-recent h2 { margin: 0; }

.norlon-recent-slider { margin-top: 42px; }
/* Track breaks out to the full viewport; the first card still lines up with the
   1160 content column via the left pad. */
.norlon-recent-track {
	display: flex; gap: 30px; overflow-x: auto; overscroll-behavior-x: contain;
	scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
	/* First card sits on the 140px content edge; the strip bleeds off the RIGHT
	   only. (A left breakout + matching left padding fought each other and
	   collapsed the inset to 0.) min() keeps it a no-op below 1160. */
	margin-left: 0;
	margin-right: min(0px, calc(580px - 50vw));
	padding-right: 24px;
	padding-bottom: 2px; scrollbar-width: none; cursor: grab;
}
.norlon-recent-track::-webkit-scrollbar { display: none; }
.norlon-recent-track.is-dragging { cursor: grabbing; scroll-snap-type: none; }
/* R2: cards are 512px with a 29px gap (pitch 541), first card on the 140px edge —
   giving 2 full cards + ~43% of a third at 1440. */
.norlon-pcard { flex: 0 0 512px; scroll-snap-align: start; }
.norlon-pcard-media { display: block; }
.norlon-pcard img { width: 100%; aspect-ratio: 540/300; object-fit: cover; display: block; }
/* R2: card title = DIN Cond Bold 30 / 5% tracking */
.norlon-pcard-title { font-family: var(--nr-din); font-weight: 700; font-size: 30px; line-height: 1.05; letter-spacing: 0.05em; text-transform: uppercase; color: var(--nr-ink); margin: 20px 0 14px; display: inline-flex; gap: 10px; text-decoration: none; }
.norlon-pcard-title:hover { color: var(--nr-red); }
.norlon-pcard-title .chev { color: var(--nr-red); }
.norlon-pcard-meta { display: flex; gap: 30px; flex-wrap: wrap; margin: 0; }
/* 11px on the #F0F0F0 Recent stripe — brand red is 4.00:1 there. See --nr-red-on-light. */
.norlon-pcard-meta dt { font-family: var(--nr-mont); font-weight: 600; font-size: 11px; line-height: 15px; letter-spacing: 0.15em; text-transform: uppercase; color: var(--nr-red-on-light); margin: 0 0 5px; }
.norlon-pcard-meta dd { font-family: var(--nr-din); font-weight: 700; font-size: 23px; line-height: 21px; letter-spacing: 0.03em; color: var(--nr-ink); margin: 0; }

/* Scroll-position indicator. R2: a FULL-WIDTH 11px #D9D9D9 track with a 10px
   Norlon-red marker. Width = visible fraction, left = scroll progress (driven by
   hero-slider.js), so it actually tracks the scroll rather than being decorative. */
.norlon-recent-scroll { position: relative; height: 11px; margin-top: 34px; background: var(--wp--preset--color--hairline-gray, #D9D9D9); margin-inline: calc(50% - 50vw); cursor: pointer; touch-action: none; }
.norlon-recent-bar { position: absolute; top: 0; left: 0; height: 10px; width: 50%; background: var(--nr-red); pointer-events: none; }

/* ============= PRESIDENT QUOTE =============
   The big quote mark bleeds UP ~43px into the gray Recent stripe above (R2). No
   top padding on the section; the inner's padding-top places the text, and the
   mark is pulled above the section edge with a negative top. overflow visible so
   the mark isn't clipped. */
.norlon-quote { position: relative; padding-block: 0 59px !important; overflow: visible; }
/* R2: a content-width 2px #D9D9D9 divider sits at the bottom of the quote stripe
   (this is the "grey bar" above the Construction Services stripe). */
.norlon-quote::after { content: ""; position: absolute; left: 50%; transform: translateX(-50%); bottom: 0; width: min(1160px, calc(100% - 48px)); height: 2px; background: var(--wp--preset--color--hairline-gray, #D9D9D9); }
.norlon-quote .norlon-quote-inner { max-width: 940px; margin-inline: auto; padding-left: 176px; padding-top: 76px; position: relative; }
/* The mark is a bespoke bold quote glyph in R2 (a 159x125 vector: solid block
   foot + curved hook), NOT a font character — recreated here as an inline SVG so
   it matches exactly. Bleeds up ~43px into the gray Recent stripe. */
.norlon-quote .norlon-quote-inner::before {
	content: ""; position: absolute; left: 0; top: -43px; width: 159px; height: 125px;
	background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 159 125'%3E%3Cg fill='%23231F20'%3E%3Cpath d='M0,116 L0,48 C0,18 22,4 50,4 C43,20 31,36 30,52 L66,52 L66,116 Z'/%3E%3Cpath d='M93,116 L93,48 C93,18 115,4 143,4 C136,20 124,36 123,52 L159,52 L159,116 Z'/%3E%3C/g%3E%3C/svg%3E") no-repeat;
	background-size: contain;
}
.norlon-quote .norlon-quote-text { font-family: var(--nr-din); font-weight: 600; font-size: 64px; line-height: 1.18; letter-spacing: 0; color: var(--nr-ink); margin: 0; max-width: 702px; }
.norlon-quote .norlon-quote-text em { font-style: italic; color: var(--nr-red); }
/* attribution (Jeremy Valeriote / President) sits at the lower-right of the quote */
.norlon-quote .norlon-quote-inner > .has-montserrat-font-family { text-align: right; margin: 8px 0 0; }
.norlon-quote .norlon-quote-inner > .has-montserrat-font-family + .has-montserrat-font-family { margin-top: 2px; }

/* ================= FOOTER (R2: 1165x169) =================
   Row 1: logo 145x90 (left) | CONTACT | AFFILIATES (both right)
   Divider, then row 2: legal links + copyright, right-aligned.  */
/* R2 column geometry across the 1160 footer: logo | 179px Contact | 172px Affiliates
   (Contact starts at 809, Affiliates at 988 — not equal thirds). */
#colophon .site-middle-footer-inner-wrap {
	display: grid !important; grid-template-columns: 1fr 179px 172px !important;
	gap: 0 !important; align-items: start;
}
/* R2: only 53px between the Connect stripe and the footer; Kadence's default
   content-area margin + footer padding was adding ~260px. */
.content-area { margin-bottom: 0 !important; }
#colophon .site-footer-row-container-inner { padding-block: 0 !important; }
#colophon .footer-widget-area { padding: 0 !important; }
#colophon .site-middle-footer-inner-wrap { padding-top: 53px !important; padding-bottom: 31px !important; } /* R2 ink: 53 top / 31 bottom */
/* R2 "Divider Line": the footer-top divider is content-width (1160) + 2px, not the
   full-bleed 1px Kadence draws on the outer container. Move it onto the 1160 wrap. */
#colophon .site-footer-row-container-inner { border-top: 0 !important; }
#colophon .site-middle-footer-inner-wrap { border-top: 2px solid var(--wp--preset--color--hairline-gray, #D9D9D9) !important; }
#colophon .site-bottom-footer-inner-wrap { padding-top: 17px !important; padding-bottom: 22px !important; }
#colophon .norlon-foot-logo img { width: 145px !important; height: auto; }
#colophon .norlon-foot-logo { margin: 0; }
/* Column headings — URW DIN Cond Bold 16 / lh17 / 3% (NOT the Montserrat eyebrow) */
#colophon .norlon-foot-head {
	font-family: var(--nr-din); font-weight: 700; font-size: 16px; line-height: 17px;
	letter-spacing: 0.03em; text-transform: uppercase; color: var(--nr-ink); margin: 0 0 6px;
}
/* Address + phone — Montserrat Bold 10 / lh15. Ink, NOT red. */
#colophon .norlon-foot-addr,
#colophon .norlon-foot-tel {
	font-family: var(--nr-mont); font-weight: 700; font-size: 10px; line-height: 15px;
	color: var(--nr-ink); margin: 0;
}
#colophon .norlon-foot-addr { letter-spacing: 0.03em; margin-bottom: 5px; }
#colophon .norlon-foot-tel  { letter-spacing: 0.09em; }
/* The phone NUMBER is Norlon-red + ExtraBold in the design (shared "primary/red"
   text style). Only the number — the T:/F: prefixes stay ink. */
#colophon .norlon-foot-tel strong { font-weight: 800; color: var(--nr-red); }
#colophon .norlon-foot-affil { display: flex; gap: 16px; align-items: center; margin: 0; }
#colophon .norlon-foot-affil figure { margin: 0; }
#colophon .norlon-foot-col { margin: 0; }

/* Bottom bar — Open Sans Medium 12 / 1%, right-aligned. Legal links are
   Norlon-red (design "primary/red" style); the "|" separators stay ink with
   generous spacing; hover adds a black underline. */
#colophon .norlon-foot-bottom { display: flex; justify-content: flex-end; align-items: baseline; gap: 47px; width: 100%; }
#colophon .norlon-foot-legal,
#colophon .norlon-foot-copy {
	font-family: "Open Sans", sans-serif; font-weight: 500; font-size: 12px;
	letter-spacing: 0.01em; color: var(--nr-ink); margin: 0;
}
#colophon .norlon-foot-legal .sep { color: var(--nr-ink); margin: 0 16px; }
#colophon .norlon-foot-legal a {
	color: var(--nr-red); text-decoration: none; text-underline-offset: 3px;
}
#colophon .norlon-foot-legal a:hover,
#colophon .norlon-foot-legal a:focus-visible {
	color: var(--nr-red); text-decoration: underline; text-decoration-color: #000;
}
@media (max-width: 767px) {
	/* The footer kept its 3-column desktop grid on mobile and Contact(179)+Affiliates(172)
	   ate the full width, collapsing the logo's column to 0 — the logo literally
	   rendered 0x0 (invisible). Give it its own full-width row (a little larger than
	   desktop's 145px), then Contact | Affiliates side by side beneath. */
	/* NB Kadence names these `site-footer-middle-section-1/-2/-3` (numeric suffix) —
	   a `.site-footer-middle-section` selector matches NOTHING. */
	#colophon .site-middle-footer-inner-wrap { grid-template-columns: 1fr 1fr !important; }
	#colophon .site-footer-middle-section-1 { grid-column: 1 / -1 !important; margin-bottom: 30px; }
	/* The figure is `is-resized`, so it carries explicit width/height attrs — override
	   both it and the img. Slightly larger than desktop's 145 per the design note. */
	#colophon .norlon-foot-logo { width: 165px !important; max-width: none !important; }
	#colophon .norlon-foot-logo img { width: 165px !important; height: auto !important; max-width: none !important; }
	#colophon .norlon-foot-bottom { justify-content: flex-start; gap: 8px; flex-direction: column; }
}

/* ============= CONNECT STRIPE (textured dark) =============
   Background + texture are defined with the 50 Years stripe above (shared).
   R2: 1440x333; 50/50 row, vertically centred — heading RIGHT-justified in the
   left half (hugs centre), copy + button LEFT-justified in the right half. */
/* R2-MEASURED (frame 208:1245 etc., 1:1): the Connect stripe is exactly 333px tall
   on EVERY page — heading/copy ink starts 105px down, the 42px button ends 89px
   above the bottom. Ours ran 378px because (a) the para→button gap collapsed to
   32px (needs 18px) and (b) the columns block added a stray 32px margin below the
   button on top of the 89px padding. Both zeroed here. */
.norlon-connect { min-height: 333px; padding-block: 100px 89px !important; }
.norlon-connect .wp-block-columns { max-width: 1160px; margin-inline: auto; gap: 48px; align-items: flex-start !important; margin-block: 0 !important; }
.norlon-connect .norlon-connect-copy { margin-bottom: 18px !important; }
.norlon-connect .wp-block-buttons { margin-top: 0 !important; margin-bottom: 0 !important; }
.norlon-connect .wp-block-columns > .wp-block-column { flex: 1 1 0 !important; min-width: 0; align-self: flex-start !important; }
.norlon-connect .wp-block-columns > .wp-block-column:first-child { text-align: right; }
.norlon-connect h2 { margin: 0; white-space: nowrap; text-align: right; }
/* copy wraps to ~4 lines as in R2, left-aligned against the centre line */
.norlon-connect-copy { max-width: 370px; margin-inline: 0; }
@media (max-width: 767px) {
	.norlon-connect .wp-block-columns { flex-wrap: wrap; gap: 20px; }
	.norlon-connect .wp-block-columns > .wp-block-column { flex: 1 1 100% !important; }
	.norlon-connect .wp-block-columns > .wp-block-column:first-child,
	.norlon-connect h2.wp-block-heading { text-align: left !important; }
	.norlon-connect h2 { white-space: normal; }
	.norlon-connect-copy { max-width: none; }
}

/* ============= SERVICES TEASER ============= */
/* R2 services teaser: heading + copy clustered left (746px), then 3 image cards,
   then a centred button. */
/* Left edge on the 140px content edge (full-bleed group ⇒ calc from viewport).
   Heading + copy are vertically CENTRED against each other (R2: their vertical
   centres align, ~2641). */
.norlon-teaser .norlon-teaser-head { max-width: 746px; margin-left: max(24px, calc(50vw - 580px)) !important; margin-right: auto !important; gap: 25px; align-items: center !important; }
.norlon-teaser .norlon-teaser-head > .wp-block-column { align-self: center !important; }
.norlon-teaser .norlon-teaser-head > .wp-block-column:first-child { flex: 0 0 384px !important; }
.norlon-teaser .norlon-teaser-head > .wp-block-column:last-child { flex: 0 0 337px !important; }
.norlon-teaser h2 { margin: 0; }
.norlon-teaser .norlon-svc-cards { gap: 27px; margin-top: 40px; align-items: flex-start; }
.norlon-teaser .wp-block-buttons { margin-top: 30px !important; }
.norlon-teaser .norlon-svc-card { flex: 1 1 0; min-width: 0; }
.norlon-teaser .norlon-svc-img { margin: 0 !important; }
.norlon-teaser .norlon-svc-img img { width: 100%; aspect-ratio: 369/187; object-fit: cover; display: block; }
/* R2: label sits directly under the image. Kill the constrained-group block-gap
   that was adding ~24px on top of the label's own margin. */
.norlon-teaser .norlon-svc-card > * + * { margin-block-start: 0 !important; }
.norlon-teaser .norlon-svc-label { font-family: var(--nr-din); font-weight: 700; font-size: 16px; line-height: 21px; letter-spacing: 0.03em; text-transform: uppercase; color: var(--nr-ink); margin: 12px 0 0 !important; }

/* ============= responsive ============= */
@media (max-width: 1024px) {
	.norlon-quote .norlon-quote-text { font-size: 40px; max-width: none; }
	.norlon-quote .norlon-quote-inner { padding-left: 130px; }
	.norlon-quote .norlon-quote-inner::before { width: 120px; height: 94px; top: -30px; }
	.norlon-50th h2 { font-size: 32px; }
}
@media (max-width: 767px) {
	/* one project per view, same horizontal-scroll behaviour + red indicator */
	.norlon-recent .wp-block-columns { max-width: none; gap: 20px; }
	.norlon-recent .wp-block-columns .wp-block-column:first-child,
	.norlon-recent .wp-block-columns .wp-block-column:last-child { flex-basis: 100% !important; }
	.norlon-pcard { flex: 0 0 82vw; }
	.norlon-pcard-title { font-size: 23px; }
	.norlon-teaser .norlon-teaser-head { max-width: none; }
	.norlon-teaser .norlon-teaser-head > .wp-block-column:first-child,
	.norlon-teaser .norlon-teaser-head > .wp-block-column:last-child { flex: 1 1 100% !important; }
	.norlon-teaser .norlon-svc-cards { flex-wrap: wrap; gap: 16px; }
	.norlon-teaser .norlon-svc-card { flex: 1 1 100%; }
	.norlon-herobar { flex-direction: column; align-items: flex-start; gap: 16px; }
	.norlon-quote .norlon-quote-text { font-size: 30px; }
	/* Phone: there is no room for the desktop 176px left inset, so the mark sits
	   ABOVE the text rather than beside it. It stays absolutely positioned (an
	   earlier version made it `position:static`, which dropped it into the flow and
	   left it sitting wholly inside the white stripe) and the text is cleared with
	   padding-top instead. A negative margin-top on a static mark would collapse
	   through .norlon-quote-inner and drag the whole block up, not just the mark. */
	.norlon-quote .norlon-quote-inner { padding-left: 0; padding-top: 55px; }
	/* top = -(height / 2) so the mark straddles the stripe boundary exactly half in
	   the gray Recent stripe above, half in this one. .norlon-quote is overflow:visible
	   and padding-top:0, so its top edge IS the boundary. */
	.norlon-quote .norlon-quote-inner::before { width: 100px; height: 79px; top: -40px; }
	/* Release the pinned 345/373px columns — otherwise they stay 800px wide inside a
	   390px viewport and get clipped (same trap as .norlon-intro). */
	.norlon-50th .wp-block-columns { text-align: center; max-width: none; gap: 24px; }
	.norlon-50th .wp-block-columns > .wp-block-column:first-child,
	.norlon-50th .wp-block-columns > .wp-block-column:last-child { flex: 1 1 100% !important; }
	/* Once the columns stack, `width:345px; max-width:100%` let the logo fill the whole
	   342px column — far heavier than the desktop treatment. Half it (345 -> 172). */
	.norlon-50th img { width: 172px; margin-inline: auto; }
}

/* Plans Rooms — links to the two drawings lists (below the login form). */
.norlon-plans-drawings { margin-top: 34px; display: flex; flex-direction: column; gap: 12px; }
.norlon-plans-drawings .wp-block-button__link { display: block; text-align: center; }

/* Plans Rooms access panel — two selector buttons; password field for the active one
   appears below. The active button inverts (white fill, red text) to show which list
   is selected. */
.norlon-access { margin-top: 34px; max-width: 460px; }
.norlon-access__buttons { display: flex; gap: 12px; flex-wrap: wrap; }
.norlon-access__tab {
	flex: 1 1 auto; border: 2px solid var(--nr-red); background: var(--nr-red); color: #fff;
	font-family: var(--nr-mont); font-weight: 700; font-size: 11px; letter-spacing: 0.09em; text-transform: uppercase;
	padding: 12px 18px; cursor: pointer; transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
.norlon-access__tab:hover { background: var(--nr-ink); border-color: var(--nr-ink); color: #fff; }
.norlon-access__tab.is-active { background: #fff; color: var(--nr-red); border-color: var(--nr-red); }
/* Kadence's content.min.css sets `.single-content form { margin: 0 }` — specificity
   (0,1,1), which beat a bare `.norlon-access__form` (0,1,0) and silently killed this
   gap. Scoped to the parent to win cleanly rather than reach for !important. */
/* margin-bottom:0 is load-bearing: both category forms are siblings inside
   .norlon-access, and only the LAST one (Tenders) had its bottom margin zeroed — so
   the Projects form carried a stray 32px and the panel was taller for Projects than
   for Tenders. Both are pinned so whichever is shown renders identically. */
.norlon-access .norlon-access__form { margin-top: 40px; margin-bottom: 0; }
.norlon-access__form[hidden] { display: none; }
.norlon-access__label { display: block; font-family: var(--nr-mont); font-weight: 700; font-size: 11px; letter-spacing: 0.15em; text-transform: uppercase; color: var(--nr-ink); margin: 0 0 10px; }
.norlon-access__row { display: flex; gap: 12px; }
.norlon-access__row input[type="password"] {
	flex: 1 1 auto; min-width: 0; box-sizing: border-box; background: var(--wp--preset--color--field-gray-light, #F0F0F0);
	border: 0; color: var(--nr-ink); font-family: "Open Sans", sans-serif; font-size: 15px; padding: 12px 16px;
}
.norlon-access__row input[type="password"]:focus { outline: 2px solid var(--nr-signal); outline-offset: 2px; }
.norlon-access__submit {
	flex: 0 0 auto; border: 0; background: var(--nr-red); color: #fff;
	font-family: var(--nr-mont); font-weight: 700; font-size: 11px; letter-spacing: 0.09em; text-transform: uppercase;
	padding: 0 22px; cursor: pointer; transition: background-color .2s ease;
}
.norlon-access__submit:hover, .norlon-access__submit:focus-visible { background: var(--nr-ink); }
.norlon-access__error { color: var(--nr-red); font-family: "Open Sans", sans-serif; font-size: 14px; margin: 12px 0 0; }
