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; }
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.
A straightforward approach to buying cars
Built On Honest Advice And Careful Vehicle Selection
Car Buying began with a simple frustration, buyers were being sold cars instead of being helped to choose them. Our team changed that by inspecting every vehicle thoroughly, documenting condition openly and offering the same price to everyone who walks through our door or contacts us online.
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 Advisors Who Help You Choose Wisely
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
Founder And Lead Buying Advisor
Karan Malhotra
Luxury Car Specialist
Divya Rana
Online Enquiries And Documentation
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.