/*
 * Roots Landscaping — design tokens & base resets.
 * Mirrors the "Earth & Rust" palette and base rules from the original
 * React/Tailwind build (index.css). These custom properties are for
 * reference/documentation; Elementor's own controls (Global Colors/Fonts)
 * are set to the same values in Site Settings so the visual editor stays
 * in sync with this file.
 */

/* Elementor's Kit generates `.elementor-widget:not(:last-child){
   --kit-widget-spacing:20px;}` unconditionally, hardcoded, regardless of
   the Kit's own "Space Between Widgets" control (confirmed: setting that
   control to 0 via postmeta + a full CSS regen made no difference to this
   specific rule). This var feeds `margin-block-end: var(--kit-widget-
   spacing, 20px)` on every non-last widget, which was silently ADDING 20px
   on top of every widget's own explicit margin-bottom throughout the
   entire site — e.g. the "Full Service Landscaping Package" card's text
   column measured 90px taller than source because of this stacking across
   its 4 widgets. Since every widget on this site already has an explicit,
   source-accurate margin set, this auto-spacing is pure double-counting —
   zero it out globally. */
.elementor-widget:not(:last-child) {
	--kit-widget-spacing: 0px !important;
}

:root {
	--rl-background: #FFF7ED;
	--rl-foreground: #431407;
	--rl-border: #FFEDD5;
	--rl-primary: #9A3412;
	--rl-primary-hover: #431407;
	--rl-secondary: #EA580C;
	--rl-secondary-hover: #C2410C;
	--rl-muted: #FED7AA;
	--rl-accent: #FB923C;
	--rl-dark-surface: #1C0800;
	--rl-gray-600: #4B5563;
	--rl-gray-700: #374151;
	--rl-gray-400: #9CA3AF;
	--rl-bronze: #CD7F32;
	--rl-bronze-hover: #B87333;
	--rl-gold: #F59E0B;
	--rl-gold-hover: #D97706;

	--rl-font-sans: 'Inter', sans-serif;

	--rl-radius-xl: 12px;
	--rl-radius-2xl: 16px;
	--rl-radius-3xl: 24px;
	--rl-radius-full: 9999px;

	--rl-shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.05);
	--rl-shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1);
	--rl-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);
	--rl-shadow-xl: 0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1);
	--rl-shadow-2xl: 0 25px 50px -12px rgba(0,0,0,0.25);
}

/* Base reset — this theme has no parent (unlike the old hello-elementor
   child theme setup) so it must supply its own baseline instead of
   inheriting the browser UA stylesheet's default body margin/box-sizing. */
*,
*::before,
*::after {
	box-sizing: border-box;
}

html {
	scroll-behavior: smooth;
	-webkit-text-size-adjust: 100%;
}

body {
	margin: 0;
	font-family: var(--rl-font-sans);
	background-color: var(--rl-background);
	color: var(--rl-foreground);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

img {
	max-width: 100%;
	height: auto;
}

/* Elementor's heading/text-editor widgets output raw semantic HTML
   (<p>, <h1-6>, <ul>/<li>, etc.) for their content — the browser's default
   UA-stylesheet margins on those tags (e.g. <p> gets ~1em top+bottom by
   default) were compounding on top of every widget's own explicit
   Elementor margin setting, since spacing on this site is fully controlled
   via those explicit per-widget margins. Confirmed case: the Full Service
   card's paragraph widget measured 122px tall instead of 86px because its
   inner <p> carried an unreset 18px top+bottom default margin. */
p,
h1, h2, h3, h4, h5, h6,
ul, ol, dl, li,
blockquote, figure {
	margin: 0;
	padding: 0;
}

.skip-link.screen-reader-text {
	position: absolute;
	left: -9999px;
	top: 0;
	z-index: 100000;
	background: var(--rl-primary);
	color: #fff;
	padding: 12px 20px;
	border-radius: 0 0 8px 0;
}
.skip-link.screen-reader-text:focus {
	left: 0;
}

/* Utility classes for values Elementor's UI controls can't express exactly
   (arbitrary Tailwind values used in the original design). */
.rl-radius-2-5rem { border-radius: 2.5rem !important; }
.rl-radius-3rem { border-radius: 3rem !important; }
.rl-hairline-top { border-top: 1px solid var(--rl-border); }
.rl-hairline-bottom { border-bottom: 1px solid var(--rl-border); }
.rl-hairline-dark-top { border-top: 1px solid var(--rl-primary-hover); }

/* Gallery image captions — source reveals these only on hover via
   `opacity-0 group-hover:opacity-100 transition-opacity duration-300` on a
   full-cover gradient overlay; the initial build made them permanently
   visible pill badges instead, matching a different (correctly always-on)
   pattern used elsewhere on the page (the About section's photo pin). */
.rl-gallery-image {
	position: relative;
	overflow: hidden;
}
.rl-gallery-caption-overlay {
	position: absolute !important;
	inset: 0;
	width: auto !important;
	background: linear-gradient(to top, rgba(28,8,0,0.8), transparent 60%) !important;
	opacity: 0;
	transition: opacity 0.3s ease;
	/* Elementor containers default to flex-direction:column, so it's
	   justify-content (main/vertical axis) that pins content to the
	   bottom here, not align-items (which would just be the horizontal
	   cross-axis and wouldn't move the caption down at all). */
	justify-content: flex-end !important;
	align-items: flex-start !important;
	padding: 24px !important;
}
.rl-gallery-image:hover .rl-gallery-caption-overlay {
	opacity: 1;
}

/* Image zoom on hover, matching source's `group-hover:scale-105
   transition-transform duration-700` on the <img> itself. Since this site
   uses container background-images rather than <img> tags, the image had
   to be split into its own full-cover inner layer (separate from the
   outer card, which keeps its fixed size/radius/shadow and clips via
   overflow:hidden) so only the image scales, not the whole card. */
.rl-gallery-image-layer {
	position: absolute !important;
	inset: 0;
	width: auto !important;
	transition: transform 0.7s ease;
}
.rl-gallery-image:hover .rl-gallery-image-layer {
	transform: scale(1.05);
}

/* "Get a Quote" button on the Full Service Landscaping Package card,
   matching source's `transition-all hover:scale-105` on the <a> itself
   (separate from the card's own `hover:-translate-y-1`). The _css_classes
   control lands on the widget's outer wrapper (prefix_class is empty in
   Elementor's common-base.php), not the inner <a>, but since the wrapper
   hugs the button tightly (its padding lives on the anchor via
   text_padding, not the wrapper), scaling the wrapper looks identical to
   scaling the button. */
.rl-btn-zoom {
	transition: transform 0.3s ease;
}
.rl-btn-zoom:hover {
	transform: scale(1.05);
}

/* Sticky header blur, matching bg-white/95 backdrop-blur-md */
.rl-header-blur {
	background-color: rgba(255,255,255,0.95) !important;
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
}

/* Glass cards on dark trust section (bg-white/10 backdrop-blur-md) */
.rl-glass-card {
	background-color: rgba(255,255,255,0.1) !important;
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
	border: 1px solid rgba(255,255,255,0.2) !important;
}
.rl-glass-card:hover {
	background-color: rgba(255,255,255,0.15) !important;
}

/* Hero live-badge ping dot */
.rl-ping-dot {
	position: relative;
	display: inline-flex;
	height: 12px;
	width: 12px;
}
.rl-ping-dot::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: 9999px;
	background-color: var(--rl-secondary);
	opacity: 0.75;
	animation: rl-ping 1.6s cubic-bezier(0,0,0.2,1) infinite;
}
.rl-ping-dot::after {
	content: "";
	position: relative;
	display: inline-flex;
	height: 12px;
	width: 12px;
	border-radius: 9999px;
	background-color: var(--rl-secondary);
}
@keyframes rl-ping {
	75%, 100% { transform: scale(2); opacity: 0; }
}

/* Prevent icon badges from being squeezed out of shape by a long sibling
   heading in a flex row (e.g. "We know new construction homes and HOA
   neighborhoods" wrapping to 2 lines was shrinking its icon badge down to
   ~39x56 instead of a fixed ~52x52 square). Elementor's icon widget has no
   generic "width"/flex-shrink control at all (a bare "width" setting is
   silently ignored on widgets — see the heading/text-editor "_element_
   custom_width" fix elsewhere in this file), so this is the only way to
   lock the icon badge to its intended square size. */
.elementor-widget-icon {
	flex-shrink: 0;
}
/* .elementor-icon is inline-block with vertical-align:baseline by default,
   which reserves ~4px of descender space below it (a classic CSS
   inline-block quirk) — that's what was making every icon badge 4px
   taller than wide instead of a true square. */
.elementor-widget-icon .elementor-icon {
	vertical-align: middle;
}

/* Card-hover icon-badge inversion, matching the source's Tailwind
   `group`/`group-hover:` pattern (Elementor's own icon-widget hover
   controls only fire on :hover of the icon itself, not the whole card). */
.rl-feature-card .rl-feature-icon,
.rl-feature-card .rl-feature-icon .elementor-icon {
	transition: background-color 0.2s ease, color 0.2s ease;
}
.rl-feature-card:hover .rl-feature-icon {
	background-color: var(--rl-primary) !important;
}
/* Elementor's own generated CSS sets an explicit `color` on the inner
   .elementor-icon element (not just inherited from the wrapper), so the
   hover override has to target that same element directly to win. */
.rl-feature-card:hover .rl-feature-icon .elementor-icon {
	color: #fff !important;
}

.rl-service-card .rl-service-icon {
	transition: background-color 0.2s ease;
}
.rl-service-card:hover .rl-service-icon {
	background-color: var(--rl-border) !important;
}
.rl-service-card {
	transition: box-shadow 0.3s ease, border-color 0.3s ease;
}

/* hover:-translate-y-1 lift — Elementor containers have no native
   hover-transform control, so this fills the gap (box-shadow-hover and
   border-hover ARE native and are set per-card via Elementor's own
   controls; this class only adds the lift + its transition). */
.rl-card-lift {
	transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.rl-card-lift:hover {
	transform: translateY(-4px);
}

/* Slight tilt for ribbon-style badges (e.g. the Hero "Free On-Site Quote"
   badge) — Elementor's Container widget has no native rotate-transform
   control, so this fills the gap via the Advanced > CSS Classes field. */
.rl-tilt-3 {
	transform: rotate(3deg);
}

/* Respect Elementor's per-page "Hide Title" setting, which only sets this
   custom property on :root — the theme must consume it. Defaults to shown. */
.rl-page-title {
	display: var(--page-title-display, block);
	font-size: 2rem;
	margin: 24px;
}

/* Fallback header/footer (only ever render if Elementor Pro Theme Builder is
   unavailable — normal operation uses the Elementor-built Header/Footer). */
.rl-fallback-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	max-width: 1280px;
	margin: 0 auto;
	padding: 16px 24px;
}
.rl-fallback-header a {
	color: var(--rl-foreground);
	text-decoration: none;
	font-weight: 700;
}
.rl-fallback-footer {
	text-align: center;
	padding: 32px 24px;
	background: var(--rl-dark-surface);
	color: var(--rl-muted);
}

/* Box-shadow fallback — Elementor Container's native box_shadow group control
   does not emit any CSS in this install (verified: zero "box-shadow:" rules in
   any generated post-*.css across the whole site, base or hover, pre-existing
   or newly built). Generating the equivalent CSS directly here, keyed by the
   element's own stable .elementor-element-{id} class so no extra markup is
   needed. Values are copied 1:1 from each element's box_shadow_box_shadow /
   box_shadow_hover_box_shadow settings. */
.elementor-element-d97486e { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.25) !important; }
.elementor-element-c64f8e7 { box-shadow: 0px 10px 15px -3px rgba(0,0,0,0.3) !important; }
.elementor-element-3646eec { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.25) !important; }
.elementor-element-14a5197 { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-14a5197:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-115faea { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-115faea:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-e150322 { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-e150322:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-ff53c56 { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-ff53c56:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-ec4dfdc { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-ec4dfdc:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-52015a8 { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-52015a8:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-221dd50 { box-shadow: 0px 10px 15px -3px rgba(0,0,0,0.1) !important; transition: box-shadow 0.3s ease; }
.elementor-element-221dd50:hover { box-shadow: 0px 20px 25px -5px rgba(0,0,0,0.1) !important; }
.elementor-element-cb8413f { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-cb8413f:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-782c8ec { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-782c8ec:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-7c58973 { box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.05) !important; transition: box-shadow 0.3s ease; }
.elementor-element-7c58973:hover { box-shadow: 0px 4px 6px -1px rgba(0,0,0,0.1) !important; }
.elementor-element-63ea2ac { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.25) !important; transition: box-shadow 0.3s ease; }
.elementor-element-63ea2ac:hover { box-shadow: 0px 30px 60px -15px rgba(154,52,18,0.4) !important; }
.elementor-element-339236a { box-shadow: 0px 20px 25px -5px rgba(0,0,0,0.15) !important; transition: box-shadow 0.3s ease; }
.elementor-element-339236a:hover { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.25) !important; }
.elementor-element-eaba15d { box-shadow: 0px 25px 50px -12px rgba(245,158,11,0.25) !important; transition: box-shadow 0.3s ease; }
.elementor-element-eaba15d:hover { box-shadow: 0px 25px 50px -12px rgba(245,158,11,0.25) !important; }
.elementor-element-254a199 { box-shadow: 0px 15px 25px -5px rgba(0,0,0,0.2) !important; }
.elementor-element-f0396d6 { box-shadow: 0px 15px 25px -5px rgba(0,0,0,0.2) !important; }
.elementor-element-d07a3e0 { box-shadow: 0px 15px 25px -5px rgba(0,0,0,0.2) !important; }
.elementor-element-6cb2fba { box-shadow: 0px 10px 15px -3px rgba(0,0,0,0.3) !important; }
.elementor-element-a65049f { box-shadow: 0px 10px 15px -3px rgba(0,0,0,0.3) !important; }
.elementor-element-1bc3eef { box-shadow: 0px 10px 15px -3px rgba(0,0,0,0.3) !important; }
.elementor-element-1713a52 { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.5) !important; }
.elementor-element-e019a0b { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.5) !important; }
.elementor-element-a677330 { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.5) !important; }
.elementor-element-0d2c36f { box-shadow: 0px 25px 50px -12px rgba(0,0,0,0.25) !important; }
.elementor-element-ffb2993 { box-shadow: 0px 20px 25px -5px rgba(0,0,0,0.2) !important; }

/* ---------------------------------------------------------------------
   Mobile burger menu — NOT part of the original source design (source
   simply hides nav links below `md` with no menu at all), added as a
   deliberate enhancement per explicit request. Toggled by rl-nav.js,
   which adds/removes `rl-mobile-menu-open` on <body>.
   --------------------------------------------------------------------- */
.rl-burger-btn {
	cursor: pointer;
}
.rl-burger-icon-close {
	display: none;
}
body.rl-mobile-menu-open .rl-burger-icon-menu {
	display: none;
}
body.rl-mobile-menu-open .rl-burger-icon-close {
	display: block;
}

/* Dropdown panel: hidden by default, sits directly under the sticky
   header, full width, shown only once JS toggles the body class. Using
   the header's own sticky positioning as the containing block (a
   position:sticky ancestor establishes one for absolute descendants). */
.rl-mobile-menu {
	display: none;
	position: absolute !important;
	top: 100%;
	left: 0;
	right: 0;
	width: auto !important;
	max-height: calc(100vh - 100%);
	overflow-y: auto;
}
body.rl-mobile-menu-open .rl-mobile-menu {
	display: flex;
}
.rl-mobile-menu-link {
	border-bottom: 1px solid #FFEDD5;
}
.rl-mobile-menu-link:last-of-type {
	border-bottom: none;
}
/* Panel itself is unconditionally in the DOM; keep it out of desktop's
   way entirely (desktop never toggles the open class, but this avoids
   any layout shift/flash-of-content risk during load). */
@media (min-width: 1025px) {
	.rl-mobile-menu {
		display: none !important;
	}
}

/* ---------------------------------------------------------------------
   Scroll-to-top button — also not in the source design, added per
   explicit request. Fixed bottom-right, fades in after scrolling past
   one viewport height (toggled by rl-nav.js via `rl-scrolltop-visible`).
   --------------------------------------------------------------------- */
.rl-scroll-top {
	position: fixed;
	right: 24px;
	bottom: 24px;
	z-index: 998;
	width: 48px;
	height: 48px;
	border-radius: 9999px;
	background-color: #9A3412;
	color: #FFFFFF;
	display: flex;
	align-items: center;
	justify-content: center;
	box-shadow: 0px 10px 15px -3px rgba(0,0,0,0.3);
	opacity: 0;
	visibility: hidden;
	transform: translateY(8px);
	transition: opacity 0.25s ease, transform 0.25s ease, background-color 0.2s ease, visibility 0.25s;
	border: none;
	cursor: pointer;
}
.rl-scroll-top.rl-scrolltop-visible {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
}
.rl-scroll-top:hover {
	background-color: #431407;
}
.rl-scroll-top svg {
	width: 22px;
	height: 22px;
	stroke: currentColor;
}
