About Us

@import url(‘https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800&family=Inter:wght@400;500;600;700;800&display=swap’);
:root {
–uw-primary: #1d4ed8;
–uw-secondary: #b4531a;
–uw-heading-font: ‘Montserrat’, -apple-system, BlinkMacSystemFont, ‘Segoe UI’, Roboto, sans-serif;
–uw-body-font: ‘Inter’, -apple-system, BlinkMacSystemFont, ‘Segoe UI’, Roboto, sans-serif;
–uw-btn-radius: 0px;

/* Motion + elevation tokens, ported from Design First (GutenbergParser::motionAndChromeStyles(),
around GutenbergParser.php:592-620, and its shadowValueFor() scale at :2466-2473). One shared
easing curve reused by every transition is what makes motion read as deliberate rather than
browser-default; the two-tier shadow is the resting-vs-elevated pair that module uses
everywhere instead of an ad-hoc shadow per component. */
–uw-ease: cubic-bezier(.22,.61,.36,1);
–uw-shadow-rest: 0 4px 20px rgba(0,0,0,.06);
–uw-shadow-hover: 0 18px 40px rgba(0,0,0,.14);
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: var(–uw-body-font); color: #333; background: #fff; }
h1, h2, h3, h4, h5, h6, .wp-block-heading { font-family: var(–uw-heading-font); }
img { max-width: 100%; display: block; }
a { text-decoration: none; }

/* ══ COVER BLOCK ══════════════════════════════════════ */
.wp-block-cover {
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
min-height: 500px;
}
.wp-block-cover__background {
position: absolute; inset: 0;
background: #000; opacity: .5; z-index: 1;
}
.has-background-dim-60 { opacity: .6 !important; }
.wp-block-cover__image-background {
position: absolute; inset: 0;
width: 100%; height: 100%;
object-fit: cover; z-index: 0;
}
.wp-block-cover__inner-container {
position: relative; z-index: 2;
width: 100%; max-width: 900px;
margin: 0 auto; padding: 80px 24px;
text-align: center;
}
.wp-block-cover__inner-container h1,
.wp-block-cover__inner-container h2,
.wp-block-cover__inner-container p { color: #fff; }

/* ══ GROUP ════════════════════════════════════════════ */
.wp-block-group { width: 100%; display: block; }
.wp-block-group.alignfull { width: 100%; }

/* Header/CTA/etc. Templates (Templates/{Category}/{Sage|Dark}/*.php) wrap their content
in a plain “wp-block-group alignwide” div and each hand-picks its own horizontal
padding — several (e.g. Templates/Header/*/RowCta.php) set none at all, so that
section’s content sits flush against the 1200px container edge instead of the 60px
gutter every .wp-block-columns/.wp-block-image.alignwide section uses elsewhere on
the same page. Force the same 60px gutter here too — excluding groups that directly
wrap a .wp-block-columns child, since that child already applies its own 60px
padding (see the COLUMNS rule below) and would otherwise get double-padded. */
html body .wp-block-group.alignwide:not(:has(> .wp-block-columns)) {
padding-left: 60px !important;
padding-right: 60px !important;
}

/* Footer templates (Templates/Footer/*.php) render

— a different gutter
than the 60px every other section uses, so the footer’s content doesn’t line up
with the header/body sections directly above it. Force it to match. */
html body footer.wp-block-group.alignfull {
padding-left: 60px !important;
padding-right: 60px !important;
}

/* ══ COLUMNS ══════════════════════════════════════════
“html body” prefix gives us 0,0,3 specificity vs
WP block CDN’s 0,0,2 — so we win regardless of
whether the CDN loads before or after us, even if
the CDN also uses !important.
══════════════════════════════════════════════════════ */
html body .wp-block-columns {
display: flex !important;
flex-wrap: nowrap !important;
gap: 60px !important;
align-items: center;
max-width: 1200px;
margin: 0 auto;
padding: 0 60px;
}

/* WP CDN adds this rule — we override it explicitly */
html body .wp-block-columns:not(.is-not-stacked-on-mobile) {
flex-wrap: nowrap !important;
}

html body .wp-block-columns.alignwide {
max-width: 1200px;
}
html body .wp-block-columns.are-vertically-aligned-center {
align-items: center !important;
}

html body .wp-block-column {
flex: 1 !important;
min-width: 0 !important;
}
html body .wp-block-column[style*=”flex-basis:50%”] { flex: 0 0 calc(50% – 30px) !important; }
html body .wp-block-column[style*=”flex-basis:55%”] { flex: 0 0 calc(55% – 30px) !important; }
html body .wp-block-column[style*=”flex-basis:45%”] { flex: 0 0 calc(45% – 30px) !important; }
html body .wp-block-column[style*=”flex-basis:40%”] { flex: 0 0 calc(40% – 30px) !important; }

/* ══ IMAGES ═══════════════════════════════════════════ */
/* Was: .wp-block-image { width: 100%; }
overflow:hidden added so the hover-zoom below stays inside the figure’s rounded corners
instead of spilling past them. */
.wp-block-image { width: 100%; overflow: hidden; }
/* Was: .wp-block-image img { width: 100%; height: auto; border-radius: 10px; object-fit: cover; }
transition added for the hover-zoom; every other declaration unchanged. */
.wp-block-image img { width: 100%; height: auto; border-radius: 10px; object-fit: cover; transition: transform .5s var(–uw-ease); }
.wp-block-image.alignwide { max-width: 1200px; margin: 0 auto; padding: 0 60px; }
.wp-block-image.alignwide img { max-height: 500px; object-fit: cover; border-radius: 0; }

/* Gentle zoom on hover — ported from Design First’s .uw-hover-zoom (GutenbergParser.php:595-597).
That module needs an opt-in class because its markup is AI-authored; here the templates already
emit .wp-block-image on 99 of 195 files, so hanging the effect off that existing class reaches
them all with no template edits. Header/footer logos are excluded below. */
.wp-block-image:hover img { transform: scale(1.06); }

/* ══ HEADER/FOOTER LOGO ═══════════════════════════════
The generic .wp-block-image img rule above (width:100%) also caught header/footer
logos, stretching them to the full width of their flex row instead of the small fixed
size Templates/Header|Footer/*.php set via width=”200″-“250” on the itself —
scope a sane cap back in for just those two contexts (higher specificity than the
generic rule above, so it wins regardless of source order). */
/* The generic `.wp-block-image { width: 100% }` above applies to the FIGURE, and the
chrome carve-out below only ever covered the inside it. In a body section that
is harmless — the figure is a block-level child of a column and 100% is what you want.
In the header it is not: the logo figure is a flex item of the logo/brand row, so
demanding 100% width makes it claim the whole row and shove the business name out to
the far right of the header, stranded above the CTA button. Capping the FIGURE to its
own content is what keeps the logo and the business name sitting together on the left.
Confirmed against a real site whose header rendered exactly that way. */
header .wp-block-image,
footer .wp-block-image {
width: auto;
max-width: 240px;
flex: 0 0 auto;
/*

carries the browser default `margin: 1em 40px`, which nothing in this
stylesheet ever reset. In a body section that margin is invisible; in a header flex
row it lifts the logo off the shared centre line and indents it by a stray 40px. */
margin: 0;
display: flex;
align-items: center;
}

/* ══ CHROME ROW ALIGNMENT ═════════════════════════════
Everything in the header/footer sits on ONE centre line with even spacing.

Two body-section rules were leaking in and breaking that: the figure margin handled
above, and `.wp-block-buttons { margin-top: 20px }`, which is right for a CTA sitting
under a paragraph and wrong for one sitting beside a nav — it pushed the header’s
Contact Us button ~20px below the logo and menu. Zeroing both here lets align-items
do its job, and the gap gives the three groups real breathing room instead of leaving
the spacing to whatever margins each child happened to bring with it.

Scoped to header/footer only, so no body section’s rhythm changes. */
header.wp-block-group,
footer.wp-block-group {
align-items: center;
gap: 24px;
}

header .wp-block-buttons,
footer .wp-block-buttons {
margin-top: 0;
margin-bottom: 0;
align-items: center;
}

/* The business name beside a logo is a heading, so it inherits the h1-h4 bottom margin
further down this stylesheet — which on a single-line flex row reads as the text
hanging above the logo rather than beside it. */
header .wp-block-heading,
header h1, header h2, header h3, header h4,
footer .wp-block-heading {
margin-top: 0;
margin-bottom: 0;
}

/* The nav the preview injects is the row’s flexible middle — see
SeoContentFirstPreviewController::buildNavHtml(). Stated here too so the same centring
survives even if that markup is ever replaced by WordPress’s own nav block. */
header .uw-scf-nav,
header .wp-block-navigation {
flex: 1;
justify-content: center;
}

header .wp-block-image img,
footer .wp-block-image img {
width: auto;
max-width: 240px;
max-height: 70px;
height: auto;
object-fit: contain;
border-radius: 0;
}

/* Same carve-out extended to the new hover-zoom: a logo that grows when the cursor passes over
the header reads as a glitch, not a flourish. Higher specificity than the generic
.wp-block-image:hover img rule above, so it wins regardless of source order. */
header .wp-block-image:hover img,
footer .wp-block-image:hover img { transform: none; }

/* ══ SELF-DECLARED IMAGE SIZE ═════════════════════════
The two rules above only fire inside a literal

/

tag. Every curated
Templates/Header|Footer/*.php emits one, but an AI-authored (Tier 2) header/footer
wraps its row in a plain

instead — so the cap
never applied there and the generic `.wp-block-image img { width: 100% }` above won,
blowing a 48px logo up to the full page width (confirmed on site 126’s stored
__global-header__ markup: rendering full-bleed).

Scoping to img[width] instead of an ancestor tag fixes both contexts at once and is
surgical: only chrome logos carry an explicit width attribute — every body image in
every generated page is emitted without one, so no content image is affected.

`width: auto` is what does the work: it lets the ‘s own width attribute act as a
presentational hint again, so the image renders at whatever size the block actually
asked for (48px here, 200px from RowCta) rather than one hardcoded number. max-height
keeps the 70px ceiling the header/footer rule above already established, and
object-fit:contain preserves the aspect ratio if that ceiling ever clamps.

Specificity 0,2,1 (class + attribute + element) beats both the generic
`.wp-block-image img` (0,1,1) and the `header .wp-block-image img` (0,1,2) rules, so
it wins regardless of source order, in curated and AI-authored chrome alike. */
.wp-block-image img[width] {
width: auto;
height: auto;
max-width: 100%;
max-height: 70px;
object-fit: contain;
border-radius: 0;
}

/* ══ HEADINGS & TEXT ══════════════════════════════════
h1-h4 color was hardcoded “color: #1a3015” (the Sage persona’s fixed secondary) on all
four rules below, ignoring whatever secondary color the site actually picked — now uses
the real #b4531a already passed into this function.
Was:
h1 { font-size: clamp(2rem, 5vw, 3.5rem); font-weight: 800; margin-bottom: 20px; color: #1a3015; line-height: 1.1; letter-spacing: -0.01em; }
h2 { font-size: 2.2rem; font-weight: 700; margin-bottom: 16px; color: #1a3015; line-height: 1.2; letter-spacing: -0.01em; }
h3 { font-size: 1.4rem; font-weight: 700; margin-bottom: 10px; color: #1a3015; line-height: 1.3; }
h4 { font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; color: #1a3015; } */
/* h2-h4 were flat rem values, so only h1 scaled with the viewport and everything below it stayed
at its desktop size until the single 900px breakpoint snapped it down. Now fluid, with each old
value kept as the clamp MAXIMUM — nothing gets larger than before at any width, it only shrinks
smoothly on the way down. Design First clamps h1+h2 (GutenbergParser.php:1913-1927); h3/h4 here
go a step further since they had no scaling at all.
Was:
h2 { font-size: 2.2rem; … }
h3 { font-size: 1.4rem; … }
h4 { font-size: 1.1rem; … } */
h1 { font-size: clamp(2rem, 5vw, 3.5rem); font-weight: 800; margin-bottom: 20px; color: #b4531a; line-height: 1.1; letter-spacing: -0.01em; }
h2 { font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 700; margin-bottom: 16px; color: #b4531a; line-height: 1.2; letter-spacing: -0.01em; }
h3 { font-size: clamp(1.2rem, 2vw, 1.4rem); font-weight: 700; margin-bottom: 10px; color: #b4531a; line-height: 1.3; }
h4 { font-size: clamp(1rem, 1.5vw, 1.1rem); font-weight: 700; margin-bottom: 8px; color: #b4531a; }
p { font-size: 1rem; line-height: 1.7; color: #555; margin-bottom: 14px; }
.has-text-align-center { text-align: center; }
.wp-block-heading { line-height: 1.2; }

/* ══ BUTTONS ══════════════════════════════════════════ */
.wp-block-buttons {
display: flex;
gap: 14px;
flex-wrap: wrap;
margin-top: 20px;
}
.wp-block-button__link {
display: inline-block;
padding: 14px 32px;
border-radius: var(–uw-btn-radius, 100px);
font-weight: 700;
font-size: 15px;
cursor: pointer;
background-color: var(–uw-primary);
/* Was “color: #fff !important” — confirmed via a real rendered screenshot (Pricing/
Sage/FeaturedCenter.php’s featured-card CTA, a deliberate white-background/
primary-color-text button) that this unconditionally forced EVERY button’s text to
white regardless of its own inline color=”” style, making any button that legitimately
wants non-white text (e.g. a light background with colored text) render invisible or
wrong in this local preview. A plain class rule already loses to a same-element inline
style without needing !important, so removing it here still correctly colors every
“normal” button white (nothing else sets a competing inline color for those) while
letting a button that deliberately sets its own color=”” win as intended. The two
existing is-style-outline/is-style-fill rules below are unaffected — both are already
more specific (two classes) AND keep their own !important, so their own forced-color
behavor is unchanged (a separate, already-tracked pattern — see e.g.
Whychooseus/Sage/IconGrid.php’s own docblock — fixed per-template by avoiding those
classes where a template needs a genuinely custom color, not by touching this rule). */
color: #fff;
border: 2px solid var(–uw-primary);
/* Was: transition: opacity .15s;
Widened so the hover rule below can animate the lift and shadow too, on the shared
easing token — matches Design First’s .uw-btn treatment (GutenbergParser.php:615-620). */
transition: transform .25s var(–uw-ease), box-shadow .25s ease, opacity .25s ease;
}
/* Was: .wp-block-button__link:hover { opacity: .88; }
Opacity alone was the only hover feedback anywhere in this stylesheet, which is a large part
of why generated pages read as static/”basic” next to Design First. Same lift+shadow pairing
that module uses. Reaches every button on every site without touching a single template,
since .wp-block-button__link is already emitted by 115 of the 195 template files. */
.wp-block-button__link:hover {
transform: translateY(-2px);
box-shadow: var(–uw-shadow-hover);
opacity: .95;
}
.wp-block-button.is-style-outline .wp-block-button__link {
background: transparent !important;
color: var(–uw-primary) !important;
border-color: var(–uw-primary);
}

/* ══ SECTION: Testimonials (dark green bg) ════════════
Selectors match the literal inline “background-color:#b4531a” the section
renderers write onto these dark-background groups (renderSectionDark()/Templates
files all use the site’s real secondary color, not a fixed hex — this used to be
hardcoded to “#1a3015″ here, which stopped matching as soon as a user picked any
other secondary color, silently dropping the white-text/padding overrides below).
Was:
.wp-block-group[style*=”background-color:#1a3015″] { padding: 80px 0; }
.wp-block-group[style*=”background-color:#1a3015″] .wp-block-columns { padding: 0 24px !important; }
.wp-block-group[style*=”background-color:#1a3015″] p { color: rgba(255,255,255,.85) !important; }
.wp-block-group[style*=”background-color:#1a3015″] p[style*=”font-weight:600″] { color: #fff !important; }
.wp-block-group[style*=”background-color:#1a3015″] p[style*=”opacity:0.7″] { color: rgba(255,255,255,.45) !important; }
.wp-block-group[style*=”background-color:#1a3015″] h1, .wp-block-group[style*=”background-color:#1a3015″] h2 { color: #fff !important; } */
.wp-block-group[style*=”background-color:#b4531a”] {
padding: 80px 0;
}
.wp-block-group[style*=”background-color:#b4531a”] .wp-block-columns {
padding: 0 24px !important;
}
.wp-block-group[style*=”background-color:#b4531a”] p {
color: rgba(255,255,255,.85) !important;
}
.wp-block-group[style*=”background-color:#b4531a”] p[style*=”font-weight:600″] {
color: #fff !important;
}
.wp-block-group[style*=”background-color:#b4531a”] p[style*=”opacity:0.7″] {
color: rgba(255,255,255,.45) !important;
}

/* ══ SECTION: Hero / CTA Split (dark green bg) ════════ */
.wp-block-group[style*=”background-color:#b4531a”] h1,
.wp-block-group[style*=”background-color:#b4531a”] h2 {
color: #fff !important;
}

/* ══ SECTION: Promise Checklist (light green bg) ══════ */
.wp-block-group[style*=”background-color:#eff7e9″] {
padding: 80px 0;
}
.wp-block-group[style*=”background-color:#eff7e9″] .wp-block-columns {
padding: 0 60px !important;
}

/* ══ SERVICES GRID INTRO ══════════════════════════════ */
.uw-services-intro { max-width: 1200px; margin: 0 auto 40px; padding: 0 60px; }

/* ══ SECTION BADGE ════════════════════════════════════ */
.uw-section-badge {
display: inline-block;
border: 1px solid var(–uw-primary);
color: var(–uw-primary);
border-radius: 100px;
padding: 4px 14px;
font-size: 13px;
margin-bottom: 20px;
font-weight: 500;
}
/* Use on a colored/dark background instead of .uw-section-badge — the plain badge’s
primary-colored border+text disappears against a similarly-colored background (the
exact contrast bug this variant exists to avoid). */
.uw-section-badge-invert {
display: inline-block;
border: 1px solid rgba(255,255,255,.7);
color: #fff;
border-radius: 100px;
padding: 4px 14px;
font-size: 13px;
margin-bottom: 20px;
font-weight: 500;
}

/* ══ CARDS / FEATURE GRID ═════════════════════════════ */
.uw-card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 28px;
max-width: 1200px;
margin: 0 auto;
padding: 0 60px;
}
.uw-card {
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 14px;
padding: 32px;
box-shadow: 0 4px 16px rgba(0,0,0,.06);
transition: transform .3s var(–uw-ease), box-shadow .3s ease;
}
.uw-card:hover { transform: translateY(-6px); box-shadow: var(–uw-shadow-hover); }
.uw-card h3, .uw-card h4 { margin-bottom: 10px; }
.uw-card p:last-child { margin-bottom: 0; }

/* ══ CARD HOVER-LIFT (inline-style targeted) ═══════════
Design First gets this by having the AI put a .uw-hover-lift class on every card it writes
(see its promptAnimationRules()). There is no AI-authored markup here to carry such a class,
and .uw-card — the obvious hook — is emitted by only 1 of the 195 template files, so a
class-based rule would do essentially nothing.

What actually makes an element read as a card in these templates is an inline box-shadow
together with a border-radius, so target that pair directly. Verified safe to override from
here: no template’s inline style uses !important on box-shadow or transform (the only inline
!important declarations anywhere under Templates/ are on background-color, border-radius,
border, color and one align-items), so these rules win without a specificity fight.

Deliberately scoped to div: the image grids in Services/Blog/Gallery put their shadow on the
itself, and those items are bare image+text stacks with no background or border of their
own — lifting one would float a shadow behind transparent content. Those get the
.wp-block-image hover-zoom above instead, which suits that shape.

Header/footer chrome is excluded so nav bars and footer panels don’t drift on hover. */
html body div[style*=”box-shadow”][style*=”border-radius”]:not(header *):not(footer *) {
transition: transform .3s var(–uw-ease), box-shadow .3s ease;
}
html body div[style*=”box-shadow”][style*=”border-radius”]:not(header *):not(footer *):hover {
transform: translateY(-6px);
box-shadow: var(–uw-shadow-hover) !important;
}

/* ══ ICON BOX ══════════════════════════════════════════ */
.uw-icon-box { text-align: center; }
.uw-icon-circle {
width: 56px; height: 56px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
margin: 0 auto 18px;
background: var(–uw-primary);
color: #fff;
font-size: 22px;
font-weight: 700;
}

/* ══ STATISTICS ════════════════════════════════════════ */
.uw-stat { text-align: center; }
.uw-stat-number {
display: block;
font-size: 2.6rem;
font-weight: 800;
color: var(–uw-primary);
line-height: 1.1;
}
.uw-stat-label { font-size: .95rem; color: #6b7280; margin-top: 6px; }

/* ══ PRICING CARDS ═════════════════════════════════════ */
.uw-pricing-card { text-align: center; position: relative; }
.uw-pricing-card.uw-pricing-featured {
border-color: var(–uw-primary) !important;
box-shadow: 0 8px 28px rgba(0,0,0,.14) !important;
transform: translateY(-6px);
}
.uw-pricing-price { font-size: 2.4rem; font-weight: 800; color: #1a1a1a; margin: 14px 0; }
.uw-pricing-price span { font-size: 1rem; font-weight: 400; color: #6b7280; }
.uw-pricing-features { list-style: none; margin: 20px 0; padding: 0; text-align: left; }
.uw-pricing-features li { padding: 8px 0; border-bottom: 1px solid #f0f0f0; }

/* ══ TEAM PROFILE CARDS ════════════════════════════════
No real team photos exist yet — an initials avatar circle (same visual idiom as
.uw-icon-circle) instead of a broken/fake . ══════════════════════════════ */
.uw-team-card { text-align: center; }
.uw-team-avatar {
width: 96px; height: 96px;
border-radius: 50%;
margin: 0 auto 16px;
display: flex; align-items: center; justify-content: center;
background: var(–uw-primary);
color: #fff;
font-size: 28px;
font-weight: 700;
}

/* ══ TIMELINE ══════════════════════════════════════════ */
.uw-timeline { position: relative; max-width: 700px; margin: 0 auto; padding-left: 40px; }
.uw-timeline::before {
content: ”; position: absolute; left: 10px; top: 6px; bottom: 6px;
width: 2px; background: #e5e7eb;
}
.uw-timeline-item { position: relative; padding-bottom: 32px; }
.uw-timeline-item:last-child { padding-bottom: 0; }
.uw-timeline-item::before {
content: ”; position: absolute; left: -34px; top: 4px;
width: 14px; height: 14px; border-radius: 50%;
background: var(–uw-primary);
}

/* ══ FAQ ACCORDION ════════════════════════════════════ */
.uw-faq-item { margin-bottom: 16px; }
.uw-faq-item details,
.uw-faq-item-centered details {
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden;
}
.uw-faq-item summary,
.uw-faq-item-centered summary {
padding: 18px 22px;
cursor: pointer;
font-weight: 700;
font-size: 18px;
color: #b4531a; /* Was: color: #1a3015; — hardcoded Sage secondary, ignored the site’s real color */
list-style: none;
display: flex;
justify-content: space-between;
align-items: center;
}
.uw-faq-item summary::-webkit-details-marker,
.uw-faq-item-centered summary::-webkit-details-marker { display: none; }
.uw-faq-item details[open] summary,
.uw-faq-item-centered details[open] summary { border-bottom: 1px solid #eee; }
.uw-faq-item details p,
.uw-faq-item-centered details div {
padding: 16px 22px;
color: #555;
line-height: 1.6;
margin: 0;
font-size: 15px;
}

/* ══ CONTACT FORM ═════════════════════════════════════ */
.uw-form-col,
.wp-block-column.uw-form-col { background-color: var(–uw-primary) !important; }

.uw-sage-form-ui { display: flex; flex-direction: column; gap: 14px; }
.uw-sage-form-ui input,
.uw-sage-form-ui textarea {
border: none;
border-radius: 8px;
padding: 14px;
font-size: 14px;
width: 100%;
font-family: inherit;
}
.uw-sage-form-ui textarea { resize: vertical; }
.uw-sage-form-ui button {
background: #fff;
color: var(–uw-primary);
border: none;
padding: 14px 32px;
border-radius: 8px;
font-weight: 800;
cursor: pointer;
width: fit-content;
}

/* ══ MODERN DARK: Green testimonial cards ═════════════ */
.uw-testimonial-card-green { background-color: #1d4ed8; border-radius: 12px; padding: 40px; } /* Was: background-color: #5b8332; — hardcoded Sage primary */
.uw-testimonial-card-green p { color: #fff !important; }

/* ══ MODERN DARK: Centered FAQ ═══════════════════════ */
.uw-faq-item-centered { margin-bottom: 16px; }

/* ══ ALIGNMENTS ═══════════════════════════════════════ */
.alignfull { width: 100%; }
.alignwide { max-width: 1200px; margin-left: auto; margin-right: auto; }
.aligncenter { display: block; margin-left: auto; margin-right: auto; }

/* ══ MOTION ═══════════════════════════════════════════
Ported from Design First’s motionAndChromeStyles() (GutenbergParser.php:558-627). The class is
applied centrally by SeoContentFirstWebsiteService::wrapSectionMarker(), which every one of the
~195 templates’ output already passes through — so no template needs to know about it.

The @supports block upgrades the entrance to a real scroll-driven animation where the browser
supports view timelines; elsewhere it degrades to a plain on-load fade-rise, which is why the
base rule stands on its own rather than living inside the @supports. */
@keyframes uwFadeRise { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: none; } }

.uw-animate-in { animation: uwFadeRise .7s var(–uw-ease) both; }

@supports (animation-timeline: view()) {
.uw-animate-in {
animation-timeline: view();
animation-range: entry 5% cover 30%;
animation-delay: 0s;
}
}

/* The section wrapper must not introduce a width or spacing of its own — it exists only to carry
the animation class. Without this, the extra .wp-block-group nesting would inherit that class’s
own layout rules and could pinch full-bleed sections. */
.uw-section { width: 100%; margin: 0; padding: 0; }

@media (prefers-reduced-motion: reduce) {
.uw-animate-in { animation: none; }
.uw-card,
.wp-block-image img,
.wp-block-button__link,
html body div[style*=”box-shadow”][style*=”border-radius”]:not(header *):not(footer *) {
transition: none;
}
.uw-card:hover,
.wp-block-image:hover img,
.wp-block-button__link:hover,
html body div[style*=”box-shadow”][style*=”border-radius”]:not(header *):not(footer *):hover {
transform: none;
}
}

/* ══ RESPONSIVE — mobile only ════════════════════════ */
@media (max-width: 900px) {

html body .wp-block-columns,
html body .wp-block-columns:not(.is-not-stacked-on-mobile) {
flex-wrap: wrap !important;
flex-direction: column !important;
padding: 0 20px !important;
gap: 30px !important;
}

html body .wp-block-column,
html body .wp-block-column[style*=”flex-basis:50%”],
html body .wp-block-column[style*=”flex-basis:55%”],
html body .wp-block-column[style*=”flex-basis:45%”],
html body .wp-block-column[style*=”flex-basis:40%”] {
flex: 0 0 100% !important;
min-width: 100% !important;
}

.uw-services-intro { padding: 0 20px; }
.wp-block-group[style*=”background-color:#eff7e9″] .wp-block-columns { padding: 0 20px !important; }
.wp-block-image.alignwide { padding: 0 20px; }
html body .wp-block-group.alignwide:not(:has(> .wp-block-columns)),
html body footer.wp-block-group.alignfull {
padding-left: 20px !important;
padding-right: 20px !important;
}
h1 { font-size: 2rem !important; }
h2 { font-size: 1.6rem !important; }
.wp-block-cover__inner-container { padding: 50px 20px; }

.uw-card-grid { grid-template-columns: 1fr !important; padding: 0 20px; }
.uw-pricing-card.uw-pricing-featured { transform: none; }
.uw-timeline { padding-left: 30px; }

/* Confirmed mobile-layout break this fixes: 21 template files build their grids as a raw
inline style=”display:grid;grid-template-columns:repeat(2..3,1fr)” on an unclassed

.
Every selector in this media query targets a class (.wp-block-columns, .uw-card-grid, …),
and no class-based selector can reach an unclassed inline-styled div at any specificity —
so those sections stayed a fixed 2-3 column grid all the way down to phone width, with no
reflow at all. Since this stylesheet fully replaces WP core CSS in both preview and
publish, nothing else was going to rescue them either. Services is among the affected
categories and appears on nearly every generated site.

Matching on the literal “display:grid” substring catches all 21 files at once regardless
of whether they wrote repeat(3, 1fr) or repeat(3,1fr). Verified overridable: no template
inline style uses !important on grid-template-columns. This also catches the four
repeat(auto-fit, minmax(…)) grids that were already self-responsive, which is harmless —
two columns at this width is what auto-fit resolves to there anyway. */
html body [style*=”display:grid”] { grid-template-columns: repeat(2,1fr) !important; }
}

@media (max-width: 600px) {
/* Second step for the same inline grids — single column on phones. */
html body [style*=”display:grid”] {
grid-template-columns: 1fr !important;
gap: 28px !important;
}
}

/* ══ WP CORE PRESET COLORS / BUTTON+SEPARATOR STYLES ═══
Everything above this block was written for the older renderSectionSage()/
renderSectionDark() hand-rolled markup (fixed .uw-* classes, hex colors always
inline). The per-option Templates/{Category}/{Sage|Dark}/{Option}.php classes (see
STRUCTURE_OPTIONS in SeoContentFirstWebsiteService) instead emit real WordPress core
block markup — global color-palette classes (has-base-color, has-contrast-color,
has-ast-global-color-4-color, …), is-style-fill/outline/logos-only button+social
variants, wp-block-separator, wp-block-accordion — which only look right on an actual
WordPress+Astra site where the theme defines those CSS custom properties and the core
block-library stylesheet. None of that exists in this Laravel preview, so — without
this block — those classes silently did nothing (default black text, invisible
separators, unstyled accordion). These rules are a best-effort approximation for
preview parity; the real destination (WordPress) still renders its own exact values,
this only prevents the preview from looking broken in the meantime. ═══════════════ */
:root {
/* base/background stay a plain light neutral — that slot always means “the light
one” regardless of which primary/secondary the user picked in the Styling step.
contrast/foreground/vivid-cyan-blue instead follow the user’s own chosen colors
(uw-primary/uw-secondary, already set from the site’s own primary_color/
secondary_color above) rather than a fixed hex, so this layer never fights the
user’s palette. */
–wp-base: #ffffff;
–wp-contrast: var(–uw-secondary);
–wp-foreground: var(–uw-secondary);
–wp-background: #ffffff;
–wp-tertiary: #ececec;
–wp-vivid-cyan-blue: var(–uw-primary);
}
.has-base-color { color: var(–wp-base) !important; }
.has-base-background-color { background-color: var(–wp-base) !important; }
.has-contrast-color { color: var(–wp-contrast) !important; }
.has-contrast-background-color { background-color: var(–wp-contrast) !important; }
.has-foreground-color { color: var(–wp-foreground) !important; }
.has-foreground-background-color { background-color: var(–wp-foreground) !important; }
.has-foreground-border-color { border-color: var(–wp-foreground) !important; }
.has-background-color { color: var(–wp-background) !important; }
.has-tertiary-background-color { background-color: var(–wp-tertiary) !important; }
.has-white-color { color: #ffffff !important; }
.has-white-background-color { background-color: #ffffff !important; }
.has-black-color { color: #000000 !important; }
.has-vivid-cyan-blue-color { color: var(–wp-vivid-cyan-blue) !important; }
.has-vivid-cyan-blue-border-color { border-color: var(–wp-vivid-cyan-blue) !important; }
.has-secondary-color { color: var(–uw-secondary) !important; }
.has-icon-color { color: var(–uw-primary); }
.has-icon-background-color { background-color: var(–uw-primary); }
.has-border-color { border-color: #e2e2e2; }
/* Text over a dark cover overlay (Hero OverlayCenter, CTA Centered/OverlayImage) —
always needs to read light regardless of the site’s own primary/secondary colors. */
.has-ast-global-color-4-color { color: #ffffff !important; }
/* Flag classes only (has-text-color/has-link-color mark “this element sets its own
color”, always paired with one of the has-{slug}-color rules above, or an inline
style= that already wins on its own) — has-link-color’s real job is making inner
tags inherit the element’s own color instead of the default link color. */
.has-link-color a { color: inherit; }

.wp-block-button.is-style-fill .wp-block-button__link {
background-color: var(–uw-primary);
border-color: var(–uw-primary);
color: #fff !important;
}
/* Icon fill/background/size is set inline per-link (from the block’s own attrs and the
site’s own primary color — see SeoContentFirstGutenbergParser::expandSocialLinks() above);
this only lays the row out. */
.wp-block-social-links { display: flex; flex-wrap: wrap; gap: 10px; list-style: none; padding: 0; margin: 0; }

/* Used on Header templates’ contact-info text (e.g. phone/email line) — was previously
undefined here, so that text rendered at the browser default size instead of the smaller
size the template intended. */
.has-small-font-size { font-size: 13px; }

.wp-block-separator {
border: none;
height: 1px;
background-color: currentColor;
opacity: .6;
margin: 24px 0;
}
.wp-block-separator.is-style-wide { width: 100%; }

/* ══ ACCORDION (FAQ) ═══════════════════════════════════
Real WordPress ships a view.js (Interactivity API) that toggles each panel open/closed
on click and rotates the +/- icon. That script isn’t loaded here, so every panel just
renders permanently open — accurate to the block’s own no-JS fallback, just not
click-interactive in this preview. ═══════════════════════════════════════════════ */
.wp-block-accordion { display: flex; flex-direction: column; gap: 12px; }
.wp-block-accordion-item {
border: 1px solid #e5e5e5;
border-radius: 8px;
overflow: hidden;
}
.wp-block-accordion-heading__toggle {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
background: transparent;
border: none;
cursor: pointer;
padding: 18px 22px;
font-size: 17px;
font-weight: 700;
text-align: left;
color: inherit;
font-family: inherit;
}
.wp-block-accordion-heading__toggle-icon { flex-shrink: 0; opacity: .6; }
.wp-block-accordion-panel { padding: 0 22px 20px; }
.wp-block-accordion-panel p { color: #555; margin: 0; }

Car buying

prateek@cvinfotech.com

07210223675


About Car Buying And The People Behind It

We are a modern car provider committed to making vehicle ownership simple, transparent and genuinely enjoyable for buyers of every budget across Haryana and the wider region.

How We Work Differently From Traditional Dealers
One advisor, start to finish

How We Work Differently From Traditional Dealers

From your first enquiry to the moment you collect your keys, one advisor stays with you. No handoffs, no pressure tactics, no surprise charges at signing. We would rather lose a sale than sell you the wrong car for your needs and budget.

The Values That Guide Every Car We Provide

Our values are not wall decoration, they shape how we price, inspect and communicate. Operating from Udyog Vihar in Gurugram and serving Ellenabad, we keep our process clear enough that any buyer can understand it in a single conversation.

The Values That Guide Every Car We Provide

Our small, experienced team combines vehicle knowledge with patient communication. Each member specialises in a different part of the buying journey, from inspection and valuation to finance paperwork and luxury vehicle sourcing.

Prateek Sharma

Prateek Sharma

Founder And Lead Buying Advisor

Karan Malhotra

Karan Malhotra

Luxury Car Specialist

Divya Rana

Divya Rana

Online Enquiries And Documentation

Sandeep Yadav

Sandeep Yadav

Vehicle Inspection Technician

Our Approach Measured In Standards Not Slogans

We track the things that protect buyers, inspection coverage, enquiry response time and pricing consistency. These standards apply equally to an entry level purchase and a premium luxury car delivery anywhere we serve.

100%

Condition Reports Shared

1

Dedicated Advisor Per Buyer

3

Specialist Service Lines

0

Pressure Selling Tactics


GET STARTED TODAY

Come And See How Simple Car Buying Should Feel

Visit our Gurugram office, call our advisors or send an online enquiry from anywhere. We will explain our process, show you current inventory and help you understand what your budget can realistically achieve today.

Car buying


📞 07210223675✉ prateek@cvinfotech.com📍 Plot No. 94B, Second Floor, Udyog Vihar Phase V Rd, Udyog Vihar, Sector 19, Gurugram, ellenabad, HR, 30959

© 2026 Car buying. All rights reserved.

Scroll to Top