/*
Theme Name: Sharjeel Child
Theme URI: https://sharjeelahmed.pk
Template: hello-elementor
Author: Sharjeel Ahmed
Author URI: https://sharjeelahmed.pk
Description: Child theme for sharjeelahmed.pk portfolio. Built on Hello Elementor (official parent), Elementor Free compatible, single-page site.
Version: 1.7.0
Requires at least: 6.0
Tested up to: 6.6
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: sharjeel-child
*/

/* =====================================================================
   PHASE 2 DESIGN CSS
   Covers the markup rendered by the 12 Sharjeel Elementor widgets only.
   No Style tab controls exist on those widgets on purpose (Elementor
   Free has no per-widget custom CSS) so every visual rule lives here,
   baked in, and edits to color/spacing/etc. happen in this one file.

   COLOR PALETTE (strict, per Phase 2 brief):
     --ink       #0b1720  dark base (kept from original design)
     --primary   #0c8b82  ALL former accent colors (orange #ff5a35,
                           lime #d7ff4f, gold #E7AD50) collapse into
                           this single accent: CTAs, hover states,
                           kickers, badges.
     --border    #C3C9D0  borders, dividers, secondary accents.
     --bg-light  #F6F7F8  light/soft section backgrounds (replaces the
                           old --paper #f5f4ee and --soft #e9efed).
     --muted     see note below.

   NOTE on --muted: the brief maps "muted text" to #C3C9D0 directly.
   Used as literal text color, #C3C9D0 on white is roughly a 1.5:1
   contrast ratio, far under WCAG AA (4.5:1) for body copy, so most
   paragraph text would become very hard to read. --muted below is
   computed from --border darkened toward --ink with color-mix(), so
   it stays visually "in family" with the strict palette but is
   actually legible. If a literal #C3C9D0 is wanted instead, replace
   the color-mix() line with: --muted:#C3C9D0; (one line change).
   Flagging this rather than silently deciding it either way.
   ===================================================================== */

@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&display=swap');

:root{
  --ink:#0b1720;
  --primary:#0c8b82;
  --border:#C3C9D0;
  --bg-light:#F6F7F8;
  --white:#fff;
  --muted:color-mix(in srgb, var(--border) 55%, var(--ink) 45%);
  --shadow:0 25px 70px rgba(11,23,32,.10);
  --max:1180px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:"DM Sans",sans-serif;background:var(--bg-light);color:var(--ink);line-height:1.6;overflow-x:hidden}
h1,h2,h3,h4{font-family:"Space Grotesk",sans-serif}
a{text-decoration:none;color:inherit}
/* PHASE 7 FIX: buttons/links below use "a.class" (element+class) instead of
   plain ".class" wherever the rule sets `color` on an anchor itself. Browsers'
   built-in stylesheet gives every <a> a slightly-higher-specificity default
   colour for :visited (and some for :hover/:active) than a single class
   selector can beat on its own, that mismatch was the "text turns blue on
   hover" bug across the site (Start a Project, service rows, etc.). Adding
   the element type ties the specificity, and author rules win ties, so this
   fixes it without ever using color:inherit (which would just take on
   whatever colour the parent element happens to be, breaking dark buttons on
   light parents and vice versa). Search "a.btn-dark", "a.service-row", etc. */
img{display:block;max-width:100%}
.container{width:min(var(--max),calc(100% - 42px));margin:auto}
.section{padding:110px 0}
.kicker{display:flex;align-items:center;gap:10px;text-transform:uppercase;letter-spacing:.16em;font-size:10px;font-weight:800;color:var(--primary)}
.kicker:before{content:"";width:30px;height:2px;background:currentColor}
.title{font-size:clamp(38px,5vw,68px);line-height:.98;letter-spacing:-.055em;color:var(--ink)}
.copy{color:var(--muted);font-size:14px;max-width:650px}
.btn{display:inline-flex;align-items:center;gap:12px;padding:14px 19px;border-radius:5px;font-size:12px;font-weight:800;transition:.25s;border:none;cursor:pointer}
a.btn-dark{background:var(--ink);color:#fff}
.btn-dark:hover{transform:translateY(-3px)}
a.btn-lime{background:var(--primary);color:#fff}
.btn-lime:hover{transform:translateY(-3px);box-shadow:0 12px 28px rgba(12,139,130,.25)}
a.btn-orange{background:var(--primary);color:#fff}
.btn-orange:hover{transform:translateY(-3px)}
a.btn-ghost{border:1px solid var(--border);background:#fff;color:var(--ink)}
.btn-ghost:hover{border-color:var(--ink)}

/* ---------- HEADER / NAVIGATION (Phase 4) ---------- */
/* section[id] gets scroll-margin-top so the sticky header (78px tall)
   never covers a section's heading when a nav link, the logo, or a
   footer link jumps to it. The original static Home.html never had a
   real working header wired up, so it never needed this; 100px = header
   height + a small buffer, kept close to the 115px already used by
   .sticky-title further down for the same "clear the sticky header"
   reason. Flagging this as a Phase 4 addition rather than a literal
   port, since there was nothing to literally port it from. */
section[id]{scroll-margin-top:100px}
.site-header{height:78px;background:rgba(246,247,248,.92);backdrop-filter:blur(16px);position:sticky;top:0;z-index:99;border-bottom:1px solid var(--border)}
.site-header .nav{height:100%;display:flex;align-items:center;justify-content:space-between;gap:20px}
a.logo{font-size:22px;font-weight:700;letter-spacing:-.06em;color:var(--ink);flex:none}
.logo span{color:var(--primary)}
.logo b{color:var(--primary)}
.navlinks{display:flex;gap:28px;font-size:11px;font-weight:700;color:#526269}
.navlinks a{position:relative;color:#526269}
.navlinks a:after{content:"";position:absolute;left:0;bottom:-9px;width:0;height:2px;background:var(--primary);transition:.2s}
.navlinks a:hover:after,.navlinks a.active:after{width:100%}
.site-header .btn{flex:none}
.menu{display:none;background:none;border:0;font-size:25px;color:var(--ink);cursor:pointer;padding:0;line-height:1}

/* ---------- HERO ---------- */
.hero{background:var(--bg-light);position:relative;overflow:hidden}
.hero:before{content:"";position:absolute;right:-160px;top:-180px;width:500px;height:500px;border-radius:50%;background:var(--primary);opacity:.14}
.hero-grid{min-height:720px;display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center;position:relative}
.hero-copy{padding:55px 0}
.hero h1{font-size:clamp(55px,7vw,94px);line-height:.88;letter-spacing:-.075em;max-width:680px;margin:18px 0 27px;color:var(--ink)}
.hero h1 em{font-style:normal;color:var(--primary)}
.hero h1 .outline{color:transparent;-webkit-text-stroke:1.5px var(--ink)}
.hero-text{font-size:15px;color:var(--muted);max-width:580px;margin-bottom:30px}
.hero-actions{display:flex;gap:10px;flex-wrap:wrap}
.hero-meta{display:flex;gap:35px;margin-top:38px;padding-top:22px;border-top:1px solid var(--border)}
.hero-meta strong{display:block;font-family:"Space Grotesk";font-size:21px;color:var(--ink)}
.hero-meta span{display:block;color:var(--muted);font-size:10px;margin-top:2px}
.hero-art{height:590px;position:relative;display:flex;align-items:center;justify-content:center}
.photo-card{width:380px;height:490px;position:relative;overflow:hidden;background:var(--ink);border-radius:190px 190px 20px 20px;box-shadow:var(--shadow);z-index:2}
.photo-card img{width:100%;height:100%;object-fit:cover;filter:grayscale(.15);mix-blend-mode:screen;opacity:.9}
.photo-overlay{position:absolute;inset:0;background:linear-gradient(180deg,transparent 35%,rgba(5,20,25,.85))}
.photo-label{position:absolute;bottom:25px;left:25px;color:#fff;z-index:2}
.photo-label b{font-size:12px;letter-spacing:.13em;text-transform:uppercase}
.photo-label span{display:block;font-size:10px;color:#dfe6e5;margin-top:5px}
.art-circle{position:absolute;width:470px;height:470px;border:1px solid var(--border);border-radius:50%;right:0;top:50px}
.art-circle:before{content:"";position:absolute;inset:35px;border:1px dashed var(--border);border-radius:50%}
/* PHASE 7 FIX: the "Available for new projects" sticker text was spilling
   outside its own circle. flex + a tight padding box keeps every line
   inside the visible ring regardless of exact wording; overflow:hidden is
   a hard backstop so a longer custom label clips instead of escaping the
   shape. Paired with the hero widget's sticker_text default now using
   explicit line breaks (Available / for new / projects) so wrapping is
   predictable instead of left to the browser to guess word-by-word. */
.sticker{position:absolute;z-index:4;background:var(--primary);color:#fff;width:110px;height:110px;border-radius:50%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:9px;font-weight:900;text-transform:uppercase;letter-spacing:.02em;line-height:1.35;padding:14px;overflow:hidden;transform:rotate(12deg);right:3%;top:10%}
.sticker:before{content:"";position:absolute;inset:8px;border:1px solid rgba(255,255,255,.5);border-radius:50%}
/* PHASE 7 FIX: the floating "5+ Years..." card used to be positioned with
   percentages against .hero-art, a container much taller than the photo
   card itself; at the default breakpoint that math placed it directly over
   the name label. Nesting it (via .photo-card-wrap) against the card's own
   real box and hanging it off the corner with small negative offsets means
   it can never land on top of the label again, at any screen size, without
   needing separate percentage math per breakpoint. */
/* PHASE 8 FIX: Phase 7 moved this card onto the photo card's own corner,
   but at bottom:-22px its top edge still climbed back over the name label
   sitting at bottom:25px. Dropped to -58px so the box's whole height now
   clears the label: the card is ~72px tall, so its top edge lands at
   roughly 14px from the photo card's bottom, below the label's 25px
   baseline. Kept hanging off the corner (rather than moved fully outside)
   so the original overlapping-card look is preserved. */
.photo-card-wrap{position:relative}
.floating-stat{position:absolute;z-index:5;background:#fff;padding:17px 18px;box-shadow:var(--shadow);border-radius:8px;left:-26px;bottom:-58px}
.floating-stat strong{font-family:"Space Grotesk";font-size:31px;line-height:1;color:var(--ink)}
.floating-stat small{display:block;font-size:9px;color:var(--muted);margin-top:4px}

/* ---------- TRUST BAR (folded into Hero widget) ---------- */
/* PHASE 7 FIX: grid-template-columns used to be a hardcoded repeat(5,1fr);
   deleting one item left an empty gap on the right since the grid still
   reserved 5 equal tracks for 4 items. Column count is now set inline per
   request from the hero widget's "Columns Per Row" control (see
   columns_style_attr() in class-widget-base.php); its default, "auto",
   uses auto-fit/minmax so whatever number of items exist always fills the
   row evenly. The old nth-child rules that hid items past the 3rd on
   tablet are dropped for the same reason, they assumed exactly 5 items. */
.trust-bar{background:var(--ink);color:#fff;border-top:1px solid #203943;border-bottom:1px solid #203943}
.trust-grid-v2{display:grid}
.trust-item{display:flex;align-items:center;gap:12px;padding:22px 18px;border-right:1px solid rgba(255,255,255,.13)}
.trust-item:first-child{padding-left:0}
.trust-item:last-child{border-right:0}
.trust-mark{width:35px;height:35px;border-radius:8px;background:#fff;color:var(--primary);display:grid;place-items:center;font-size:9px;font-weight:900}
.trust-item strong{display:block;font-family:"Space Grotesk";font-size:11px;color:#fff}
.trust-item small{display:block;color:#91a8ae;font-size:7px;letter-spacing:.1em;margin-top:2px}

/* ---------- ABOUT ---------- */
.about-v2{background:#fff}
.about-grid-v2{display:grid;grid-template-columns:.9fr 1.1fr;gap:90px;align-items:center}
.about-card-v2{background:var(--ink);border-radius:24px;padding:42px;color:#fff;position:relative;overflow:hidden;min-height:390px;box-shadow:var(--shadow)}
.about-card-v2:after{content:"";position:absolute;width:260px;height:260px;border:55px solid rgba(12,139,130,.22);border-radius:50%;right:-90px;bottom:-80px}
.about-card-v2 .big{font-family:"Space Grotesk";font-size:120px;line-height:.8;font-weight:700;letter-spacing:-.09em;position:relative;z-index:1}
.small-label{font-size:12px;color:#a8bec4;position:relative;z-index:1;margin-top:15px}
.about-card-note{position:absolute;left:42px;bottom:38px;z-index:2;font-size:14px;max-width:230px;color:#c5d5d8}
.about-list-v2{display:grid;grid-template-columns:1fr 1fr;gap:13px;margin:30px 0}
.check-v2{display:flex;gap:10px;align-items:flex-start;font-size:12px;font-weight:700;color:var(--ink)}
.check-v2 i{width:20px;height:20px;border-radius:50%;background:var(--bg-light);color:var(--primary);display:grid;place-items:center;font-style:normal;font-size:12px;flex:none}

/* ---------- EXPERTISE ---------- */
.expertise{background:#fff;position:relative;overflow:hidden}
.expertise:before{content:"";position:absolute;right:-180px;top:80px;width:420px;height:420px;border:1px solid var(--bg-light);border-radius:50%;pointer-events:none}
.expertise:after{content:"EXPERTISE";position:absolute;right:-18px;bottom:40px;font-family:"Space Grotesk";font-size:120px;font-weight:800;letter-spacing:-.08em;color:var(--bg-light);transform:rotate(-90deg);pointer-events:none}
.expertise .container{position:relative;z-index:1}
.head-row{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(260px,.7fr);gap:80px;align-items:end;margin-bottom:38px}
.head-row .copy{max-width:430px;font-size:14px;line-height:1.8;margin-bottom:5px}
/* PHASE 7: CTA added under the "I combine development..." copy. Its own
   flex column keeps the button under the paragraph regardless of how many
   lines the copy wraps to, and stays inside the same grid track .copy
   already used so the section's overall two-column balance is untouched. */
.expertise-head-actions{display:flex;flex-direction:column;align-items:flex-start;gap:18px}
.expertise-head-actions .copy{margin-bottom:0}
/* PHASE 7 FIX: grid-template-columns is now set inline per the "Columns
   Per Row" control (default "auto" = auto-fit/minmax), same reasoning as
   the trust bar above, so removing a card never leaves a gap on the right.
   The two fixed responsive overrides that assumed exactly 4 cards are
   dropped for the same reason; auto-fit already reflows at any width. */
.expertise-grid{display:grid;gap:16px}
.expertise-card{background:var(--bg-light);border:1px solid var(--border);border-radius:16px;min-height:345px;padding:27px;position:relative;overflow:hidden;transition:transform .35s ease,background .35s ease,border-color .35s ease,box-shadow .35s ease;display:flex;flex-direction:column;box-shadow:0 8px 24px rgba(11,23,32,.035)}
.expertise-card:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,rgba(12,139,130,.08),transparent 42%);opacity:0;transition:.35s}
.expertise-card:hover{background:var(--ink);border-color:var(--ink);color:#fff;transform:translateY(-9px);box-shadow:0 24px 45px rgba(8,28,36,.14)}
.expertise-card:hover:before{opacity:1}
.expertise-card:after{content:"";position:absolute;right:-42px;bottom:-42px;width:105px;height:105px;border:1px solid rgba(12,139,130,.10);border-radius:50%;pointer-events:none;transition:.35s ease}
.expertise-card:hover:after{right:-30px;bottom:-30px;border-color:rgba(12,139,130,.35)}
.expertise-no{font-family:"Space Grotesk";font-size:10px;color:var(--primary);font-weight:800;letter-spacing:.12em;position:relative;z-index:1}
.expertise-icon{width:62px;height:62px;border:1px solid var(--border);border-radius:50%;display:grid;place-items:center;font-family:"Space Grotesk";font-size:27px;color:var(--primary);margin:32px 0 25px;background:#fff;position:relative;z-index:1;transition:.35s}
.expertise-card:hover .expertise-icon{background:var(--primary);border-color:var(--primary);color:#fff;transform:rotate(-8deg) scale(1.05)}
.expertise-card h3{font-family:"Space Grotesk";font-size:25px;line-height:1.08;letter-spacing:-.035em;position:relative;z-index:1;color:var(--ink)}
.expertise-card:hover h3{color:#fff}
.expertise-card p{font-size:11px;line-height:1.7;color:var(--muted);margin-top:10px;max-width:250px;position:relative;z-index:1}
.expertise-card:hover p{color:#c9dedb}
.expertise-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:auto;padding-top:20px;position:relative;z-index:1}
.expertise-tags span{font-size:9px;line-height:1;border:1px solid var(--border);border-radius:999px;padding:8px 10px;color:var(--muted);background:#fff}
.expertise-card:hover .expertise-tags span{color:#dce7e8;border-color:#385057;background:transparent}
.expertise-card .line{position:absolute;bottom:0;left:0;width:100%;height:4px;background:var(--primary);transform:scaleX(0);transform-origin:left;transition:.35s;z-index:2}
.expertise-card:hover .line{transform:scaleX(1)}
.expertise-card .arrow{position:absolute;right:22px;top:22px;width:31px;height:31px;border:1px solid var(--border);border-radius:50%;display:grid;place-items:center;font-size:13px;color:var(--muted);transition:.35s;z-index:2}
.expertise-card:hover .arrow{border-color:var(--primary);background:var(--primary);color:#fff;transform:translate(2px,-2px)}

/* ---------- SERVICES ---------- */
.services{background:var(--ink);color:#fff}
.services .title{color:#fff}
.services .copy{color:#9eb2b8}
/* PHASE 7: paragraph + CTA moved into the right column, stacked, so this
   scopes the shared .head-row's alignment to "center" for Services only,
   the other sections reusing .head-row (Expertise, Projects, Certifications)
   keep their own existing bottom-alignment untouched. */
.services .head-row{align-items:center}
.services-head-actions{display:flex;flex-direction:column;align-items:flex-start;gap:22px}
.service-list{margin-top:50px;border-top:1px solid rgba(255,255,255,.16)}
.service-row{display:grid;grid-template-columns:70px 1.1fr 1.6fr 80px;gap:25px;align-items:center;padding:28px 5px;border-bottom:1px solid rgba(255,255,255,.16);transition:.25s;color:#fff}
a.service-row{color:#fff}
.service-row:hover{padding-left:18px;background:rgba(255,255,255,.035)}
.service-row .num{color:var(--primary);font-size:12px;font-family:"Space Grotesk";font-weight:700}
.service-row h3{font-size:25px;letter-spacing:-.04em}
.service-row p{font-size:12px;color:#94aab0;max-width:500px}
.service-arrow{width:43px;height:43px;border:1px solid rgba(255,255,255,.22);border-radius:50%;display:grid;place-items:center;color:var(--primary);font-size:18px;justify-self:end}

/* ---------- EXPERIENCE ---------- */
.experience{background:var(--bg-light)}
.experience-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:90px}
.sticky-title{position:sticky;top:115px;height:max-content}
.timeline{border-left:1px solid var(--border);padding-left:35px}
.timeline-item{position:relative;padding:0 0 48px}
.timeline-item:before{content:"";position:absolute;left:-41px;top:5px;width:11px;height:11px;border-radius:50%;background:var(--primary);border:3px solid var(--bg-light);box-shadow:0 0 0 1px var(--primary)}
.timeline-date{font-size:10px;color:var(--primary);font-weight:800;letter-spacing:.08em;text-transform:uppercase}
.timeline h3{font-size:25px;margin:8px 0 3px;color:var(--ink)}
.timeline h4{font-family:"DM Sans";font-size:12px;color:var(--primary);font-weight:800}
.timeline p{font-size:12px;color:var(--muted);max-width:650px;margin-top:10px}
.timeline-tags{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px}
.timeline-tags span{font-size:9px;padding:5px 8px;border:1px solid var(--border);border-radius:20px;color:var(--muted);background:#fff}

/* ---------- TOOLS ---------- */
.tools{background:#fff}
.tools-layout{display:grid;grid-template-columns:.75fr 1.25fr;gap:65px;align-items:start}
.tool-cloud{display:grid;gap:10px}
.tool{border:1px solid var(--border);background:#f8faf9;padding:13px 14px;border-radius:12px;min-height:72px;display:flex;align-items:center;gap:12px;transition:.25s;box-shadow:0 5px 18px rgba(11,23,32,.035)}
.tool:hover{background:var(--ink);color:#fff;transform:translateY(-3px);box-shadow:0 14px 28px rgba(11,23,32,.12)}
.tool-logo{width:38px;height:38px;border-radius:10px;background:#fff;display:grid;place-items:center;font-size:10px;font-weight:900;color:var(--primary);flex:none}
.tool strong{font-family:"Space Grotesk";font-size:11px;color:var(--ink)}
.tool:hover strong{color:#fff}
.tool small{display:block;font-size:8px;color:var(--muted);margin-top:1px;text-transform:uppercase;letter-spacing:.05em}
.tool:hover small{color:#a5b9bd}
.tools-note{margin-top:35px;border-left:3px solid var(--primary);padding-left:16px;font-size:12px;color:var(--muted)}

/* ---------- PROCESS ---------- */
.process-v2{padding:82px 0 92px;background:#fff;overflow:hidden}
.process-intro-v3{display:grid;grid-template-columns:1.05fr .95fr;gap:70px;align-items:center;margin-bottom:52px}
.process-heading-v3{max-width:620px}
.process-title-v3{font-family:"Space Grotesk",sans-serif;font-size:clamp(48px,5.8vw,78px);line-height:.94;letter-spacing:-.055em;color:var(--ink);margin:14px 0 0}
.process-title-v3 em{font-style:normal;color:var(--primary)}
/* PHASE 7 FIX: intro paragraph + "Let's Work Together" button now sit
   right-aligned as a stacked column (line, then paragraph, then button),
   instead of a left-aligned row. align-items:flex-end keeps all three
   flush to the same right edge, so the little accent line sits directly
   above the paragraph's own edge rather than pinned to the column's edge
   while the (now right-aligned) text extends further right past it. */
.process-intro-copy-v3{display:flex;flex-direction:column;align-items:flex-end;gap:14px;max-width:560px;margin-left:auto}
.process-intro-copy-v3 p{font-size:14px;line-height:1.75;color:var(--muted);margin:0;max-width:500px;text-align:right}
.process-line-v3{width:42px;height:3px;background:var(--primary);display:block;flex:none}
.process-cta-v4{margin:0;padding:13px 17px;font-size:9px}
/* PHASE 7 FIX: column count now comes from the actual number of steps
   ("auto") or an explicit editor choice via the widget's "Columns Per
   Row" control, computed in class-process-widget.php's render(), instead
   of a template hardcoded for exactly 4 (1fr 28px 1fr 28px 1fr 28px 1fr)
   with a separate connector element wedged into each 28px gap column.
   The connecting arrow is now a ::after pseudo-element on the card itself
   (below) with its own explicit gap and z-index, which is also what fixes
   it being invisible: the old connector was a plain sibling <div> with no
   z-index, so later cards painted over it in source order at some screen
   widths. An explicit z-index always wins over that regardless of order. */
.process-flow-v3{display:grid;gap:28px;align-items:stretch}
.process-card-v3{background:var(--bg-light);border:1px solid var(--border);border-radius:18px;padding:24px 23px 22px;min-height:285px;position:relative;overflow:visible;transition:transform .35s ease,background .35s ease,border-color .35s ease,box-shadow .35s ease}
/* PHASE 8 FIX: this accent line used to be a full-width 4px bar pinned to
   top:0/left:0. It was invisible while the card still had overflow:hidden,
   but Phase 7 switched the card to overflow:visible (so the connector arrow
   could sit outside it), and the bar's square ends immediately began poking
   out past the card's 18px rounded corners, most obviously on the always-on
   "Strategize" card. Insetting it and rounding its own ends keeps it fully
   inside the card on both the hover state and the pre-highlighted state,
   which is what it always looked like before. */
.process-card-v3:before{content:"";position:absolute;top:6px;left:18px;right:18px;height:4px;background:var(--primary);border-radius:999px;transform:scaleX(0);transform-origin:left;transition:transform .35s ease}
.process-card-v3:hover,.process-card-v3.is-active{background:var(--ink);border-color:var(--ink);transform:translateY(-8px);box-shadow:0 22px 45px rgba(11,23,32,.16);color:#fff}
.process-card-v3:hover:before,.process-card-v3.is-active:before{transform:scaleX(1)}
.process-card-top-v3{display:flex;align-items:center;justify-content:space-between;gap:10px}
.process-card-top-v3 span{font-family:"Space Grotesk",sans-serif;font-size:12px;font-weight:800;color:var(--primary)}
.process-card-top-v3 b{font-size:8px;letter-spacing:.16em;color:var(--primary)}
.process-badge-v3{width:54px;height:54px;border-radius:15px;background:#dff4f1;color:var(--primary);display:grid;place-items:center;font-size:25px;font-weight:700;margin:35px 0 24px;transition:.35s ease}
.process-card-v3:hover .process-badge-v3,.process-card-v3.is-active .process-badge-v3{background:var(--primary);color:#fff;transform:rotate(-5deg) scale(1.05)}
.process-card-v3 h3{font-family:"Space Grotesk",sans-serif;font-size:24px;line-height:1.15;letter-spacing:-.02em;color:var(--ink);margin:0}
.process-card-v3 p{font-size:11px;line-height:1.65;color:var(--muted);margin:10px 0 16px}
.process-card-v3:hover h3,.process-card-v3.is-active h3{color:#fff}
.process-card-v3:hover p,.process-card-v3.is-active p{color:#a9bcc1}
.process-tags-v3{display:flex;gap:7px;flex-wrap:wrap}
.process-tags-v3 i{font-style:normal;font-size:8px;padding:6px 9px;border:1px solid var(--border);border-radius:999px;color:var(--muted);background:#fff}
.process-card-v3:hover .process-tags-v3 i,.process-card-v3.is-active .process-tags-v3 i{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.16);color:#c7d6d9}
/* PHASE 8 FIX: the connector arrow was drawn on each card's RIGHT edge
   (:not(:last-child):after, right:-41px). That put the arrow inside the
   stacking context of the card it belonged to, and the NEXT card in the
   DOM paints after it, so the arrow following a transformed card (the
   hovered one, and the always-on "Strategize" card, both of which get a
   `transform` and therefore their own stacking context) was covered by
   its neighbour, while the others sat on top. That's the inconsistent
   "some in front, some behind" look.
   Now the arrow hangs off each card's LEFT edge instead, on every card
   except the first. Visually identical (it still lands in the gap between
   two cards), but it now belongs to the LATER of the two cards, and later
   siblings paint above earlier ones, so every arrow is on top of its
   left-hand neighbour. No z-index tug-of-war, it's fixed by paint order. */
.process-card-v3:not(:first-child):after{content:"→";position:absolute;top:50%;left:-40px;width:26px;height:26px;border-radius:50%;background:#fff;border:1px solid var(--primary);color:var(--primary);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;transform:translateY(-50%);z-index:6;box-shadow:0 4px 10px rgba(11,23,32,.08)}
/* The arrow is a child of the card, so the card's -8px hover/active lift
   would drag it upward too and make the row of arrows look uneven. This
   cancels that lift out so every arrow stays on the same line. */
.process-card-v3:hover:after,.process-card-v3.is-active:after{transform:translateY(calc(-50% + 8px))}


/* ---------- PROJECTS ---------- */
.projects-v4{background:#07151d;color:#fff;padding:105px 0 92px;overflow:hidden}
.projects-v4 .container{position:relative}
.projects-head-v4{display:grid;grid-template-columns:1.15fr .85fr;gap:80px;align-items:end;margin-bottom:55px}
.projects-kicker-v4{display:flex;align-items:center;gap:12px;color:var(--primary);margin:0}
.projects-kicker-v4 span{font-family:"Space Grotesk",sans-serif;font-size:10px;color:var(--primary);letter-spacing:.14em}
.projects-title-v4{font-family:"Space Grotesk",sans-serif;font-size:clamp(54px,7vw,92px);line-height:.9;letter-spacing:-.065em;color:#fff;margin:17px 0 0}
.projects-title-v4 em{font-style:normal;color:var(--primary)}
.projects-intro-v4{max-width:510px;padding-bottom:5px}
.projects-intro-v4 p{font-size:14px;line-height:1.75;color:#9eb2b8;margin:0 0 24px}
.project-link-v4 span{color:var(--primary);font-size:16px}
/* PHASE 7: "Start a project ↗" restyled from a plain underlined text link
   into the same button system (padding/radius/weight) the rest of the site
   uses, just in a light-on-dark "outline" treatment that fits this section's
   dark background, per the "make ghost/text-only CTAs consistent" request. */
a.project-link-v4{display:inline-flex;align-items:center;gap:10px;color:#fff;border:1px solid rgba(255,255,255,.35);border-radius:5px;padding:14px 19px;font-size:11px;font-weight:800}
a.project-link-v4:hover{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.6);transform:translateY(-3px)}
/* PHASE 7: category tabs (WordPress / SEO / Ads and any custom tab).
   PHASE 8 FIX: these are real <button> elements, and Hello Elementor /
   Elementor's own base button styling claims `button:hover` with a
   background of its own (the pink that was showing through). The rules
   below use `button.project-tab-v4` so they out-specify a bare element
   selector, and they state background explicitly in every state rather
   than leaving it to inherit, so nothing outside this file can repaint
   them. Same reasoning as the site-wide `a.btn-*` fix at the top. */
button.project-tab-v4{background:transparent;border:1px solid rgba(255,255,255,.18);color:#9eb2b8;border-radius:999px;padding:11px 20px;font-family:"DM Sans",sans-serif;font-size:11px;font-weight:800;letter-spacing:.02em;cursor:pointer;transition:.25s;-webkit-appearance:none;appearance:none}
button.project-tab-v4:hover,button.project-tab-v4:focus{background:rgba(12,139,130,.18);border-color:var(--primary);color:#fff;outline:none}
button.project-tab-v4.is-active,button.project-tab-v4.is-active:hover,button.project-tab-v4.is-active:focus{background:var(--primary);border-color:var(--primary);color:#fff}
.project-tabs-v4{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:32px}
.project-showcase-v4{display:grid;gap:22px}
.shot-card-v4.is-tab-hidden{display:none}
.shot-frame-v4{background:#0d2028;border:1px solid rgba(255,255,255,.13);border-radius:20px;padding:9px;box-shadow:0 25px 60px rgba(0,0,0,.2);transition:transform .4s ease,border-color .4s ease,box-shadow .4s ease}
.shot-card-v4:hover .shot-frame-v4{transform:translateY(-8px);border-color:rgba(12,139,130,.55);box-shadow:0 32px 70px rgba(0,0,0,.32)}
.shot-topbar-v4{height:34px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:0 10px;color:#789097;font-size:7px;letter-spacing:.12em;font-weight:800}
.shot-topbar-v4 b{justify-self:end;color:var(--primary);font-family:"Space Grotesk";font-size:10px}
.shot-dots-v4{display:flex;gap:4px}
.shot-dots-v4 i{width:5px;height:5px;border-radius:50%;background:#42565d;display:block}
.shot-window-v4{height:455px;background:#02090d;border-radius:13px;overflow:hidden;position:relative}
.shot-window-v4:before{content:"";position:absolute;inset:0;box-shadow:inset 0 0 0 1px rgba(255,255,255,.06);z-index:2;pointer-events:none}
.shot-window-v4 img{width:100%;height:auto;min-height:100%;display:block;object-fit:cover;object-position:top;transform:translateY(0);transition:transform var(--scroll-duration,5.5s) cubic-bezier(.18,.72,.22,1)}
.shot-card-v4:hover .shot-window-v4 img{transform:translateY(var(--scroll))}
.shot-hover-v4{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);display:flex;align-items:center;gap:8px;white-space:nowrap;background:rgba(7,21,29,.88);border:1px solid rgba(255,255,255,.18);border-radius:999px;padding:8px 12px;color:#fff;font-size:8px;letter-spacing:.06em;opacity:.88;transition:.35s;z-index:4;pointer-events:none}
.shot-hover-v4 span{color:var(--primary);font-size:13px;line-height:.7}
.shot-card-v4:hover .shot-hover-v4{opacity:0;transform:translate(-50%,8px)}
.shot-info-v4{display:grid;grid-template-columns:1fr auto;gap:16px;align-items:start;padding:22px 4px 14px}
.project-type-v4{font-size:8px;letter-spacing:.15em;color:var(--primary);font-weight:900}
.shot-info-v4 h3{font-family:"Space Grotesk",sans-serif;font-size:25px;line-height:1.15;letter-spacing:-.025em;color:#fff;margin:7px 0 0}
.shot-info-v4 p{font-size:10px;line-height:1.6;color:#8ea4ab;margin:8px 0 0;max-width:330px}
.project-result-v4{text-align:right;border-left:1px solid rgba(255,255,255,.15);padding-left:14px;margin-top:3px}
.project-result-v4 b{display:block;font-size:10px;color:#fff}
.project-result-v4 small{display:block;margin-top:3px;font-size:7px;color:#71878e;text-transform:uppercase;letter-spacing:.08em}
.project-tags-v4{display:flex;gap:7px;flex-wrap:wrap;padding:0 4px}
.project-tags-v4 span{font-size:8px;color:#9eb2b8;border:1px solid rgba(255,255,255,.13);border-radius:999px;padding:6px 9px;background:rgba(255,255,255,.025)}
.projects-footer-v4{margin-top:54px;padding-top:20px;border-top:1px solid rgba(255,255,255,.12);display:flex;align-items:center;justify-content:space-between;gap:20px;color:#6f858c;font-size:9px}
/* PHASE 7 FIX: this was the site's main "have a project in mind" CTA
   rendered at 10px, easy to miss. Bumped to a size/weight that reads as
   an actual call to action instead of fine print. */
.projects-footer-v4 a{color:#fff;text-decoration:none;font-size:15px;font-weight:800}
.projects-footer-v4 a:hover{color:var(--primary)}
.projects-footer-v4 a b{color:var(--primary);font-weight:800}

/* ---------- CERTIFICATIONS ---------- */
.certs-modern{background:var(--bg-light);position:relative;overflow:hidden;padding:112px 0 110px}
.certs-modern:before{content:"";position:absolute;width:600px;height:600px;border:1px solid rgba(12,139,130,.09);border-radius:50%;right:-330px;top:20px;pointer-events:none}
.certs-modern .container{position:relative;z-index:1}
/* PHASE 8: head row is now heading-only on the left, and paragraph + proof
   block stacked on the right, vertically centered against the heading.
   Widened the right track since it now carries body copy, not just the
   compact proof strip. */
.cert-modern-head{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center;margin-bottom:30px}
.cert-modern-aside{display:flex;flex-direction:column;gap:22px}
.cert-modern-heading .kicker{color:var(--primary);display:flex;align-items:center;gap:12px;font-size:10px;font-weight:900;letter-spacing:.2em;white-space:nowrap}
.cert-modern-heading .kicker:before{content:none}
.cert-modern-heading .kicker i{display:block;width:38px;height:2px;background:var(--primary);flex:none}
.cert-modern-heading h2{font-family:"Space Grotesk",sans-serif;font-size:clamp(52px,6vw,78px);line-height:.91;letter-spacing:-.065em;color:var(--ink);margin:18px 0 0}
.cert-modern-heading h2 em{font-style:normal;color:var(--primary)}
.cert-modern-aside p{font-size:13px;line-height:1.75;color:var(--muted);max-width:520px;margin:0}
.cert-modern-proof{display:flex;align-items:center;gap:16px}
.cert-proof-badge{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;background:#fff;border:1px solid var(--border);color:var(--primary);font-size:25px;box-shadow:0 8px 24px rgba(11,23,32,.06);flex:none}
.cert-proof-copy{display:flex;flex-direction:column;gap:4px;max-width:210px}
.cert-proof-copy strong{font-family:"Space Grotesk";font-size:13px;color:var(--ink)}
.cert-proof-copy span{font-size:10px;line-height:1.5;color:var(--muted)}
.cert-total{border-left:1px solid var(--border);padding-left:30px;margin-left:auto;display:flex;flex-direction:column}
.cert-total b{font-family:"Space Grotesk";font-size:45px;line-height:.85;color:var(--primary);letter-spacing:-.06em}
.cert-total span{font-size:8px;font-weight:900;text-transform:uppercase;letter-spacing:.17em;color:var(--muted);margin-top:8px}
.cert-modern-feature{min-height:330px;border:1px solid var(--border);border-radius:17px;background:#f6fbf9;display:grid;grid-template-columns:1.08fr .92fr;overflow:hidden;position:relative;margin-top:22px}
.cert-feature-media{padding:52px 24px 24px 24px;position:relative;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f8fcfa,#edf6f3)}
.cert-feature-label{position:absolute;left:24px;top:18px;background:var(--primary);color:#fff;border-radius:999px;padding:7px 12px;font-size:8px;font-weight:900;letter-spacing:.12em;z-index:3}
.cert-feature-frame{width:min(430px,100%);height:235px;background:#fff;border:1px solid var(--border);border-radius:9px;padding:9px;box-shadow:0 15px 35px rgba(11,23,32,.11);display:flex;align-items:center;justify-content:center}
.cert-feature-frame img{width:100%;height:100%;object-fit:contain;display:block}
.cert-feature-content{padding:44px 48px 35px 26px;position:relative;overflow:hidden}
.cert-feature-content:after{content:"";position:absolute;width:270px;height:270px;border:42px solid rgba(12,139,130,.06);border-radius:50%;right:-120px;bottom:-140px}
.cert-platform{font-size:10px;font-weight:900;letter-spacing:.2em;color:var(--primary);margin-bottom:13px}
.cert-platform span{font-size:20px;vertical-align:-2px;margin-right:5px}
.cert-feature-content h3{font-family:"Space Grotesk";font-size:27px;line-height:1.05;letter-spacing:-.035em;color:var(--ink);margin:0 0 16px;max-width:460px}
.cert-feature-content p{font-size:11px;line-height:1.75;color:var(--muted);max-width:480px;margin:0}
.cert-feature-points{display:flex;gap:22px;flex-wrap:wrap;margin-top:23px;position:relative;z-index:2}
.cert-feature-points span{font-size:9px;color:#25373d;white-space:nowrap}
.cert-laurel{position:absolute;right:30px;bottom:-18px;font-size:160px;line-height:1;color:#e7f2ef;transform:rotate(-20deg);z-index:1}
.cert-modern-grid{display:grid;gap:16px;margin-top:48px}
.cert-modern-card{background:#fff;border:1px solid var(--border);border-radius:16px;overflow:hidden;box-shadow:0 9px 28px rgba(11,23,32,.055);transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease}
.cert-modern-card:hover{transform:translateY(-7px);box-shadow:0 18px 38px rgba(11,23,32,.12);border-color:#9fc9c3}
.cert-card-image{height:137px;background:var(--bg-light);padding:9px;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}
.cert-card-image:after{content:"";position:absolute;inset:9px;border:1px solid rgba(12,139,130,.16);border-radius:6px;pointer-events:none}
.cert-card-image img{width:100%;height:100%;object-fit:contain;background:#fff;border-radius:5px;display:block;transition:transform .35s ease}
.cert-modern-card:hover .cert-card-image img{transform:scale(1.025)}
.cert-number{position:absolute;left:12px;top:12px;width:30px;height:30px;border-radius:7px;background:var(--primary);color:#fff;display:grid;place-items:center;font-size:9px;font-weight:900;z-index:4}
.cert-verified{position:absolute;right:12px;top:12px;width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.93);border:1px solid var(--border);color:var(--primary);display:grid;place-items:center;font-size:15px;z-index:4;box-shadow:0 4px 12px rgba(11,23,32,.05)}
.cert-card-content{padding:13px 14px 15px}
.cert-card-content h3{font-family:"Space Grotesk";font-size:13px;line-height:1.2;color:var(--ink);margin:0 0 10px;min-height:31px}
.cert-card-content>div{display:flex;justify-content:space-between;gap:8px;align-items:center}
.cert-card-content span{font-size:8px;color:var(--muted);white-space:nowrap}

/* ---------- TESTIMONIALS ---------- */
.testimonials-v2{background:#fff}
.testimonial-grid-v2{display:grid;grid-template-columns:1.1fr .9fr;gap:22px;margin-top:48px}
.quote-main-v2{background:var(--ink);color:#fff;border-radius:20px;padding:45px;min-height:310px;display:flex;flex-direction:column;justify-content:space-between}
.quote-mark-v2{font-family:Georgia;font-size:60px;color:var(--primary);line-height:.5}
.quote-main-v2 blockquote{font-family:"Space Grotesk";font-size:23px;line-height:1.35;letter-spacing:-.025em;max-width:700px}
.client-v2{display:flex;align-items:center;gap:12px}
.client-avatar-v2{width:43px;height:43px;border-radius:50%;background:var(--primary);display:grid;place-items:center;font-weight:900;color:#fff}
.client-v2 small{display:block;color:#9eb5bc;font-size:10px}
.testimonial-stack-v2{display:grid;gap:16px}
.quote-small-v2{border:1px solid var(--border);border-radius:15px;padding:24px}
.quote-small-v2 p{font-size:12px;color:var(--muted)}
.quote-small-v2 strong{display:block;margin-top:16px;font-size:12px;color:var(--ink)}

/* ---------- CTA ---------- */
.cta-v2{padding:80px 0;background:var(--bg-light)}
.cta-box-v2{background:linear-gradient(135deg,var(--primary),var(--ink));border-radius:25px;padding:65px;display:flex;align-items:center;justify-content:space-between;gap:30px;color:#fff;position:relative;overflow:hidden}
.cta-box-v2:after{content:"";position:absolute;width:360px;height:360px;border:75px solid rgba(255,255,255,.06);border-radius:50%;right:-150px;top:-190px}
.cta-box-v2 h2{font-size:clamp(38px,5vw,65px);line-height:.95;letter-spacing:-.06em;max-width:720px;position:relative;z-index:1}
.cta-box-v2 p{color:#cfe3e6;max-width:650px;margin-top:16px;font-size:13px;position:relative;z-index:1}
.cta-box-v2 .btn{position:relative;z-index:2;flex:none}

/* ---------- FOOTER ---------- */
footer{background:var(--ink);color:#fff;padding:65px 0 24px}
.footer-grid{display:grid;grid-template-columns:1.4fr .7fr .7fr 1fr;gap:45px}
.footer-logo{font-family:"Space Grotesk";font-size:24px;font-weight:700;letter-spacing:-.06em}
.footer-logo b{color:var(--primary)}
footer p{font-size:11px;color:#829ba2;max-width:340px;margin-top:13px}
footer h4{font-size:10px;text-transform:uppercase;letter-spacing:.13em;margin-bottom:15px;color:#fff}
.footer-links{display:grid;gap:8px}
.footer-links a{font-size:11px;color:#829ba2}
.footer-links a:hover{color:#fff}
.footer-bottom{border-top:1px solid rgba(255,255,255,.1);margin-top:45px;padding-top:18px;display:flex;justify-content:space-between;color:#718990;font-size:9px}

/* =====================================================================
   RESPONSIVE
   ===================================================================== */
@media(max-width:950px){
  .navlinks{display:none}
  .menu{display:block}
  .navlinks.open{display:flex;position:absolute;top:77px;left:20px;right:20px;padding:20px;background:#fff;box-shadow:var(--shadow);border-radius:8px;flex-direction:column;gap:17px;max-height:75vh;overflow:auto}
  .hero-grid,.experience-grid,.tools-layout,.testimonial-grid-v2{grid-template-columns:1fr}
  /* PHASE 8 FIX: .sticky-title is `position:sticky` so the Experience
     heading stays pinned beside its timeline on desktop, where the two sit
     in separate columns. Once the section stacks into one column the
     heading is directly ABOVE the timeline, so sticking it just parks it
     on top of the timeline items as they scroll past, which is the
     overlap seen on mobile. Sticky only makes sense in the two-column
     layout, so it is switched off with the layout. */
  .sticky-title{position:static;top:auto}
  /* PHASE 8: hero felt empty top and bottom on smaller screens. The 720px
     desktop min-height and the hero-copy's own 55px band are both desktop
     proportions, so both are dropped here and the section's rhythm comes
     from the grid gap instead. */
  .hero-grid{padding:42px 0;min-height:0;gap:34px}
  .hero-copy{padding:0}
  .hero-art{height:520px}
  .head-row,.projects-head-v4,.cert-modern-head{align-items:flex-start;flex-direction:column;grid-template-columns:1fr;gap:22px}
  .services-head-actions{align-items:flex-start}
  /* PHASE 7: mobile/tablet safety net. These 5 sections all take their
     grid-template-columns from an inline style (the "Columns Per Row"
     widget control), which normal specificity rules can't override, only
     !important can. Forcing auto-fit here means the grid always reflows
     sensibly on a small screen no matter what column count was chosen for
     desktop. */
  .expertise-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr)) !important}
  .about-grid-v2{grid-template-columns:1fr}
  .trust-grid-v2{grid-template-columns:repeat(auto-fit,minmax(140px,1fr)) !important}
  .tool-cloud{grid-template-columns:repeat(auto-fit,minmax(160px,1fr)) !important}
  .process-intro-v3{grid-template-columns:1fr;gap:22px;margin-bottom:38px}
  .process-intro-copy-v3{align-items:flex-start;margin-left:0}
  .process-intro-copy-v3 p{text-align:left}
  .process-flow-v3{grid-template-columns:repeat(auto-fit,minmax(240px,1fr)) !important;gap:16px}
  .process-card-v3:after{display:none}
  .process-card-v3{min-height:270px}
  .project-showcase-v4{grid-template-columns:repeat(auto-fit,minmax(280px,1fr)) !important}
  .shot-window-v4{height:430px}
  .cert-modern-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr)) !important}
  .cert-modern-feature{grid-template-columns:1fr}
  .cert-feature-content{padding:32px 30px 34px}
  .cert-feature-media{padding-top:58px}
  .cta-box-v2{align-items:flex-start;flex-direction:column}
  .footer-grid{grid-template-columns:1fr 1fr}
}
@media(max-width:600px){
  .container{width:calc(100% - 28px)}
  .section{padding:75px 0}
  .hero h1{font-size:53px}
  .hero-grid{padding:26px 0;gap:26px}
  .hero-art{height:430px}
  .photo-card{width:275px;height:365px}
  .art-circle{width:350px;height:350px;top:40px}
  .sticker{width:82px;height:82px;font-size:7.5px;padding:9px;right:0}
  .floating-stat{left:-8px;bottom:-46px;padding:12px}
  .hero-meta{gap:20px}
  .expertise-grid,.footer-grid{grid-template-columns:1fr !important}
  .expertise-card{min-height:290px}
  .trust-grid-v2{grid-template-columns:repeat(auto-fit,minmax(120px,1fr)) !important}
  .trust-item{padding:16px 8px}
  .about-card-v2{min-height:330px}
  .about-card-v2 .big{font-size:90px}
  .about-list-v2{grid-template-columns:1fr}
  /* PHASE 8 FIX: the old mobile rule was `38px 1fr 35px` with the paragraph
     forced onto row 2 via grid-column:2/4. That left the arrow auto-placed
     into its own cell below the text, producing the tall empty band in the
     middle of every row. Explicit grid areas instead: number, title and
     arrow share the first line, description sits under the title. Nothing
     is auto-placed, so there are no leftover empty cells to pad out. */
  .service-row{
    grid-template-columns:auto 1fr auto;
    grid-template-areas:"num title arrow" ". desc desc";
    gap:6px 12px;
    padding:22px 5px;
    align-items:center;
  }
  .service-row .num{grid-area:num}
  .service-row h3{grid-area:title;font-size:20px}
  .service-row p{grid-area:desc;max-width:none;margin-top:2px}
  .service-arrow{grid-area:arrow;width:35px;height:35px}
  .timeline{padding-left:25px}
  .timeline-item:before{left:-31px}
  .tool{min-width:calc(50% - 6px)}
  .tool-cloud{grid-template-columns:1fr !important}
  .process-v2{padding:65px 0 70px}
  .process-title-v3{font-size:46px}
  .process-flow-v3{grid-template-columns:1fr !important;gap:12px}
  .process-card-v3{min-height:0;padding:22px}
  .process-card-v3:after{display:none}
  .process-badge-v3{margin:28px 0 18px}
  .process-intro-copy-v3{display:flex;flex-direction:column;align-items:flex-start}
  .process-intro-copy-v3 p{text-align:left}
  .process-cta-v4{margin:0}
  .projects-v4{padding:75px 0 70px}
  .projects-title-v4{font-size:48px}
  .project-showcase-v4{grid-template-columns:1fr !important}
  .shot-window-v4{height:430px}
  .shot-info-v4{grid-template-columns:1fr}
  .project-result-v4{display:none}
  .projects-footer-v4{align-items:flex-start;flex-direction:column}
  .certs-modern{padding:78px 0 82px}
  .cert-modern-heading h2{font-size:46px}
  .cert-modern-proof{align-items:flex-start;flex-wrap:wrap}
  .cert-total{margin-left:0;padding-left:20px}
  .cert-modern-grid{grid-template-columns:1fr !important;gap:14px}
  .cert-card-image{height:205px}
  .cert-feature-frame{height:205px}
  .cert-feature-content h3{font-size:24px}
  .cert-feature-points{gap:10px;flex-direction:column}
  .cert-laurel{display:none}
  .cta-box-v2{padding:40px 25px}
  .quote-main-v2{padding:30px}
  .quote-main-v2 blockquote{font-size:20px}
  .footer-bottom{flex-direction:column;gap:8px}
}

/* =====================================================================
   PHASE 3 / PHASE 10: CONTACT POPUP MODAL
   Markup rendered by Sharjeel_Contact_Render::render_modal(), triggered
   by any .sharjeel-cta-popup-trigger element (see class-widget-base.php).
   #c0392b below is a functional validation-error red, not a decorative
   accent, so it is not one of the 3 strict palette colors, flagging this
   choice rather than silently picking it.

   PHASE 10 FIX, submit button colour: the site-wide button rules further
   up this file are deliberately written as "a.btn-dark", "a.btn-lime"
   etc. (see the PHASE 7 FIX comment near the top) to beat the browser's
   own higher-specificity <a> colour default. The popup's submit button is
   a real <button>, not an <a>, so it never matched "a.btn-dark" and fell
   through to the parent theme/Elementor's own default button styling,
   which is where the unwanted pink came from. Rather than lean on the
   btn-dark/btn-lime system at all here, .sharjeel-popup-submit below is
   fully self-contained: background, colour, and hover/focus states are
   all declared directly against the class itself, element-agnostic, so
   it cannot silently fall back to any theme default again.

   PHASE 10 FIX, close icon: swapped the "&times;" text glyph for an
   inline SVG (see class-contact-render.php). Centring a glyph inside a
   circular button with display:grid only centres its em box, and most
   typefaces do not draw "×" perfectly centred within that box, hence the
   slightly-off icon. An SVG with an explicit viewBox has no such offset.
   ===================================================================== */
.sharjeel-popup-overlay{position:fixed;inset:0;background:rgba(11,23,32,.78);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;padding:20px;z-index:999;opacity:0;visibility:hidden;transition:opacity .25s ease}
.sharjeel-popup-overlay.is-open{opacity:1;visibility:visible}
.sharjeel-popup{background:#fff;border-radius:20px;max-width:520px;width:100%;padding:38px 34px 32px;position:relative;box-shadow:0 30px 80px rgba(11,23,32,.28);transform:translateY(14px);transition:transform .25s ease;max-height:92vh;overflow-y:auto}
.sharjeel-popup:before{content:"";position:absolute;top:0;left:0;right:0;height:5px;border-radius:20px 20px 0 0;background:linear-gradient(90deg,var(--primary),var(--ink))}
.sharjeel-popup-overlay.is-open .sharjeel-popup{transform:translateY(0)}
.sharjeel-popup-close{position:absolute;top:18px;right:18px;width:32px;height:32px;border-radius:50%;border:1px solid var(--border);background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ink);padding:0;transition:.2s;flex:none}
.sharjeel-popup-close svg{display:block}
.sharjeel-popup-close:hover{background:var(--ink);color:#fff;border-color:var(--ink);transform:rotate(90deg)}
.sharjeel-popup h3{font-family:"Space Grotesk",sans-serif;font-size:25px;letter-spacing:-.03em;color:var(--ink);margin:0 28px 6px 0}
.sharjeel-popup-sub{font-size:12px;color:var(--muted);margin-bottom:24px}
.sharjeel-field{margin-bottom:16px;display:flex;flex-direction:column;gap:6px}
.sharjeel-field label{font-size:11px;font-weight:700;color:var(--ink);text-transform:uppercase;letter-spacing:.04em}
.sharjeel-field input,.sharjeel-field textarea{border:1px solid var(--border);border-radius:10px;padding:12px 14px;font-family:"DM Sans",sans-serif;font-size:13px;color:var(--ink);background:var(--bg-light);resize:vertical;transition:.2s;width:100%}
.sharjeel-field input:focus,.sharjeel-field textarea:focus{outline:none;border-color:var(--primary);background:#fff;box-shadow:0 0 0 4px rgba(12,139,130,.12)}
.sharjeel-field input.has-error,.sharjeel-field textarea.has-error,.sharjeel-select-wrap.has-error select{border-color:#c0392b}
.sharjeel-field-error{font-size:10px;color:#c0392b;min-height:12px}
.sharjeel-hp-wrap{position:absolute;left:-9999px;top:-9999px;opacity:0;pointer-events:none}
.sharjeel-popup-status{font-size:11px;margin-bottom:10px;min-height:14px}
.sharjeel-popup-status.is-success{color:var(--primary);font-weight:700}
.sharjeel-popup-status.is-error{color:#c0392b;font-weight:700}
body.sharjeel-popup-lock{overflow:hidden}

/* Custom select: a plain <select> keeps its browser-native arrow, which
   clashes with the rest of the field styling, so the native appearance is
   removed and a theme-coloured chevron is drawn instead via background-image. */
.sharjeel-select-wrap{position:relative}
.sharjeel-select-wrap select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid var(--border);border-radius:10px;padding:12px 38px 12px 14px;font-family:"DM Sans",sans-serif;font-size:13px;color:var(--ink);background-color:var(--bg-light);width:100%;cursor:pointer;transition:.2s}
.sharjeel-select-wrap select:focus{outline:none;border-color:var(--primary);background-color:#fff;box-shadow:0 0 0 4px rgba(12,139,130,.12)}
.sharjeel-select-wrap:after{content:"";position:absolute;right:15px;top:50%;width:8px;height:8px;margin-top:-6px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:rotate(45deg);pointer-events:none}
select.has-error{border-color:#c0392b}

/* Budget: currency dropdown + live figure sit on one row above the
   slider, min/max hints sit below it, values populated by contact-popup.js
   using sharjeelContact.budgetRanges (localized from PHP so the bounds a
   visitor can pick from always match what the server accepts). */
.sharjeel-budget-top{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.sharjeel-currency-wrap{flex:0 0 92px}
.sharjeel-currency-wrap select{padding:10px 30px 10px 12px;font-weight:700}
.sharjeel-budget-figure{font-family:"Space Grotesk",sans-serif;font-size:22px;font-weight:700;color:var(--primary);letter-spacing:-.02em}
.sharjeel-range{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:999px;background:linear-gradient(to right,var(--primary) 0%,var(--primary) var(--sharjeel-range-progress,25%),var(--border) var(--sharjeel-range-progress,25%),var(--border) 100%);outline:none;cursor:pointer;margin:6px 0}
.sharjeel-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;border-radius:50%;background:#fff;border:4px solid var(--primary);box-shadow:0 3px 10px rgba(11,23,32,.25);cursor:pointer;transition:.15s}
.sharjeel-range::-webkit-slider-thumb:hover{transform:scale(1.12)}
.sharjeel-range::-moz-range-thumb{width:20px;height:20px;border-radius:50%;background:#fff;border:4px solid var(--primary);box-shadow:0 3px 10px rgba(11,23,32,.25);cursor:pointer}
.sharjeel-range::-moz-range-track{height:6px;border-radius:999px;background:var(--border)}
.sharjeel-range::-moz-range-progress{height:6px;border-radius:999px;background:var(--primary)}
.sharjeel-budget-scale{display:flex;justify-content:space-between;font-size:10px;color:var(--muted);margin-top:8px}

.sharjeel-popup-submit{width:100%;display:flex;align-items:center;justify-content:center;gap:10px;margin-top:6px;padding:15px 20px;border:none;border-radius:10px;background:var(--primary);color:#fff;font-family:"DM Sans",sans-serif;font-size:13px;font-weight:800;letter-spacing:.02em;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,background .2s ease}
.sharjeel-popup-submit:hover{background:var(--ink);transform:translateY(-2px);box-shadow:0 14px 30px rgba(11,23,32,.2)}
.sharjeel-popup-submit:focus-visible{outline:none;box-shadow:0 0 0 4px rgba(12,139,130,.25)}
.sharjeel-popup-submit:active{transform:translateY(0)}
.sharjeel-popup-submit:disabled{opacity:.65;cursor:not-allowed;transform:none}

@media(max-width:600px){
  .sharjeel-popup{padding:30px 22px 26px;border-radius:16px}
  .sharjeel-budget-top{flex-wrap:wrap}
  .sharjeel-budget-figure{font-size:19px}
}
