/* /services — our established dark/green identity. The .reveal/.delay-N
   staggered entrance, the ambient drifting backdrop, and the scroll-
   triggered reveal below are techniques borrowed from patricksoares.ch/'s
   coming-soon page — recoloured to our green, not their gold, and without
   the serif/phoenix branding, which is theirs, not ours.
*/
@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@500;700&display=swap");

.svc-sr-only{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;
}

:root{
  --svc-bg:#0a0a0c;
  --svc-panel:#131316;
  --svc-panel2:#1a1b1f;
  --svc-ink:#f2f4f7;
  --svc-muted:#9aa0ab;
  --svc-line:rgba(255,255,255,.10);
  --svc-gold-light:#4ade80;
  --svc-gold:#22c55e;
  --svc-gold-deep:#16a34a;
  --svc-gold-glow:rgba(34,197,94,.35);
  --svc-num: "JetBrains Mono", ui-monospace, "SF Mono", Consolas, monospace;
  /* Named motion system: durations + curves as tokens instead of scattered
     literals, so new interactions reach for a category instead of guessing
     a new timing each time. --svc-ease/--svc-spring are kept (existing
     rules already reference them) but now just alias into this system. */
  --motion-fast: 120ms;
  --motion-normal: 220ms;
  --motion-slow: 420ms;
  --ease-out: cubic-bezier(.2,.7,.2,1);
  --ease-spring: cubic-bezier(.34,1.56,.64,1);
  --svc-spring: var(--ease-spring);
  --svc-ease: var(--ease-out);
  /* Visual height of .svc-cart-fab (padding + content), kept as a token so
     every place that needs to reserve room for it — page bottom padding,
     the WhatsApp button's resting position — reads the same number. */
  --request-bar-height: 60px;
}


/* ---- Reveal entrance system (identical timing to the reference) ---- */
@media (prefers-reduced-motion: no-preference){
  .reveal{ opacity:0; transform:translateY(12px); animation: svcReveal .85s var(--svc-ease) forwards; }
  .delay-1{ animation-delay:.12s; }
  .delay-2{ animation-delay:.23s; }
  .delay-3{ animation-delay:.34s; }
  .delay-4{ animation-delay:.45s; }
}
@keyframes svcReveal{ to{ opacity:1; transform:none; } }

/* Scroll-triggered variant of the same reveal, for content below the fold
   (stat tiles, category tiles) — services.js adds .is-visible via
   IntersectionObserver the first time each element enters the viewport.
   A soft blur+scale is layered onto the original slide-up so sections
   arrive with more of chillbase.net's cinematic weight, not just a fade. */
@media (prefers-reduced-motion: no-preference){
  .reveal-scroll{
    opacity:0; transform:translateY(22px) scale(.985); filter:blur(6px);
    transition: opacity .7s var(--svc-ease), transform .7s var(--svc-ease), filter .7s var(--svc-ease);
  }
  .reveal-scroll.is-visible{ opacity:1; transform:none; filter:blur(0); }
  .svc-stats-row .reveal-scroll:nth-child(2){ transition-delay:.08s; }
  .svc-stats-row .reveal-scroll:nth-child(3){ transition-delay:.16s; }
  .svc-cat-grid .reveal-scroll:nth-child(2){ transition-delay:.05s; }
  .svc-cat-grid .reveal-scroll:nth-child(3){ transition-delay:.1s; }
  .svc-cat-grid .reveal-scroll:nth-child(4){ transition-delay:.15s; }
  .svc-cat-grid .reveal-scroll:nth-child(5){ transition-delay:.2s; }
}

/* ---- Custom scrollbar — chillbase.net keeps its own thin, on-brand
   scrollbar instead of the OS default grey one; ours does the same,
   recoloured to our green. Unscoped selectors are safe here because this
   stylesheet only ever loads on /services. ---- */
html{ scrollbar-width:thin; scrollbar-color: var(--svc-gold) rgba(255,255,255,.05); }
*::-webkit-scrollbar{ width:10px; height:10px; }
*::-webkit-scrollbar-track{ background:rgba(255,255,255,.03); }
*::-webkit-scrollbar-thumb{
  background:var(--svc-gold); border-radius:999px;
  border:2px solid var(--svc-bg); background-clip:padding-box;
}
*::-webkit-scrollbar-thumb:hover{ background:var(--svc-gold-light); }

/* ---- Page-local header (this page only — the site-wide _inc/header.php
   is disabled here via $no_header in index.php): two small floating glass
   pills over the hero, chillbase.net-style — a logo-only pill and a
   "Menu +" pill — instead of a solid nav bar. Reuses .btn/.lang-switcher
   since those still drive real behaviour elsewhere — restyled here, scoped
   safely because this stylesheet loads only on /services. ---- */
.svc-nav{ position:absolute; top:0; left:0; right:0; z-index:40; padding:16px; }
.svc-nav-pills{ display:flex; justify-content:center; gap:10px; }
.svc-nav-pill{
  display:flex; align-items:center; gap:8px; height:44px; padding:0 18px;
  border-radius:999px; background:rgba(255,255,255,.06); backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
  border:1px solid rgba(255,255,255,.14); cursor:pointer; color:var(--svc-ink);
  box-shadow:0 8px 24px rgba(0,0,0,.22);
  transition: border-color .2s ease, background .2s ease, transform .2s var(--svc-spring), box-shadow .2s ease;
}
.svc-nav-pill:hover{
  border-color:rgba(34,197,94,.4); background:rgba(34,197,94,.1);
  transform:translateY(-1px); box-shadow:0 10px 28px rgba(34,197,94,.22);
}
/* A restrained editorial wordmark instead of an icon-only dot — still a
   single small pill, not a traditional navbar. */
.svc-nav-pill-brand{ gap:9px; }
.svc-nav-brand-word{
  font-family:var(--svc-num); font-size:12.5px; font-weight:700; letter-spacing:.06em;
  text-transform:uppercase; color:var(--svc-ink); white-space:nowrap;
}
.svc-nav-brand-divider{ color:var(--svc-gold); margin:0 1px; }
.svc-nav-pill-menu{ list-style:none; }
.svc-nav-pill-menu::-webkit-details-marker{ display:none; }
.svc-nav-menu-label{ font-weight:700; font-size:13.5px; }
.svc-nav-mini{ position:relative; }
.svc-nav-mini[open] .svc-nav-pill-menu{ border-color:rgba(34,197,94,.5); background:rgba(34,197,94,.12); }

.svc-nav-plus{
  position:relative; width:12px; height:12px; display:inline-block;
  transition: transform .3s var(--svc-spring);
}
.svc-nav-plus::before, .svc-nav-plus::after{
  content:""; position:absolute; background:var(--svc-ink); border-radius:2px;
}
.svc-nav-plus::before{ left:0; right:0; top:50%; height:2px; margin-top:-1px; }
.svc-nav-plus::after{ top:0; bottom:0; left:50%; width:2px; margin-left:-1px; }
.svc-nav-mini[open] .svc-nav-plus{ transform:rotate(45deg); }

.svc-nav-mobile-panel{
  position:absolute; left:50%; top:56px; transform:translateX(-50%); z-index:45;
  width:min(280px, 90vw);
  background:var(--svc-panel2); border:1px solid var(--svc-line); border-radius:14px;
  box-shadow:0 24px 60px rgba(0,0,0,.55); padding:8px;
  display:flex; flex-direction:column; gap:2px;
  animation: svcNavPanelIn .22s var(--svc-spring);
}
@keyframes svcNavPanelIn{ from{ opacity:0; transform:translateX(-50%) translateY(-8px) scale(.97); } to{ opacity:1; transform:translateX(-50%) translateY(0) scale(1); } }
.svc-nav-mobile-panel a{
  color:rgba(246,241,228,.7); font-weight:600; font-size:14.5px; padding:11px 14px; border-radius:8px;
  text-align:center; transition: background .16s ease, color .16s ease;
}
.svc-nav-mobile-panel a:hover{ background:rgba(34,197,94,.14); color:#fff; }
.svc-nav-mobile-panel a.btn{ margin-top:4px; }
.svc-nav-mobile-panel .btn.primary{ background:var(--svc-gold); color:var(--svc-bg); border:0; }
.svc-nav-mobile-panel .btn.dark{ background:rgba(255,255,255,.06); }
.svc-nav-mobile-lang{ padding:6px 14px; display:flex; justify-content:center; }

/* ---- Page-local footer: legal | centered brand | contact, chillbase.net-style
   three-part row instead of a multi-column link dump. ---- */
/* A light wash independent of the 3D scene's own footer calm-state — text
   legibility here must not depend on the scene tuning being perfect. */
.svc-foot{
  border-top:1px solid var(--svc-line); padding:40px 0 22px; position:relative; z-index:1;
  background:rgba(10,10,12,.55); backdrop-filter:blur(2px); -webkit-backdrop-filter:blur(2px);
}
.svc-foot-row{
  display:grid; grid-template-columns:1fr auto 1fr; align-items:center; gap:24px;
  padding-bottom:28px; margin-bottom:18px; border-bottom:1px solid var(--svc-line);
}
.svc-foot-brand{ display:grid; gap:10px; justify-items:center; text-align:center; }
.svc-brand{ display:flex; align-items:center; gap:9px; }
.svc-brand-dot{
  width:9px; height:9px; border-radius:999px; background:var(--svc-gold);
  box-shadow:0 0 0 6px rgba(34,197,94,.16), 0 0 12px rgba(34,197,94,.55);
}
.svc-brand-word{
  font-weight:900; font-size:16px; letter-spacing:.03em;
  background: linear-gradient(135deg, var(--svc-gold-light) 0%, var(--svc-gold) 55%, var(--svc-gold-deep) 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}
.svc-foot-logo{ font-size:15px; }
.svc-foot-desc{ color:var(--svc-muted); font-size:12.5px; line-height:1.6; }
.svc-foot-col{ display:grid; gap:10px; align-content:start; }
.svc-foot-contact{ justify-items:end; text-align:right; }
.svc-foot-col a{ color:rgba(246,241,228,.7); font-size:13px; transition:color .16s ease; display:inline-flex; align-items:center; gap:7px; }
.svc-foot-col a:hover{ color:var(--svc-gold-light); }
.svc-foot-contact a i{ color:var(--svc-gold); }
.svc-foot-bottom{ color:var(--svc-muted); font-size:12px; font-family:var(--svc-num); text-align:center; }
@media (max-width:760px){
  .svc-foot-row{ grid-template-columns:1fr; gap:22px; text-align:center; }
  .svc-foot-legal, .svc-foot-contact{ justify-items:center; text-align:center; order:2; }
  .svc-foot-brand{ order:1; }
}

/* A quiet dark pill with a green icon, not a solid WhatsApp-green circle —
   the request/cart CTA is the control that should dominate the corner, not
   this. Smaller too, and steps up above the cart bar (rather than
   overlapping) whenever it's showing. */
.svc-whatsapp{
  position:fixed; right:14px; bottom:calc(14px + env(safe-area-inset-bottom));
  width:34px; height:34px; border-radius:10px;
  background:rgba(255,255,255,.06); border:1px solid var(--svc-line);
  display:flex; align-items:center; justify-content:center; color:#25D366;
  font-size:14px; opacity:.75; box-shadow:0 8px 18px rgba(0,0,0,.3); z-index:45;
  transition: transform .16s var(--svc-spring), box-shadow .16s ease, opacity .16s ease, bottom .2s var(--svc-ease), background .16s ease;
}
/* The visible pill stays 34px; ::before enlarges the actual tap target to
   the ~44px minimum (same technique as .svc-sheet-handle) without making
   the control look bigger. */
.svc-whatsapp::before{ content:''; position:absolute; inset:-5px; }
.svc-whatsapp:hover{ opacity:1; background:rgba(37,211,102,.12); border-color:rgba(37,211,102,.4); transform:translateY(-2px); box-shadow:0 12px 24px rgba(0,0,0,.4); }
body.has-cart-fab .svc-whatsapp{ bottom:calc(var(--request-bar-height) + 24px + env(safe-area-inset-bottom)); }
/* Never compete with a foreground conversion surface: any sheet/overlay or
   the mobile menu open takes priority over the WhatsApp shortcut. */
body.svc-overlay-open .svc-whatsapp,
body:has(.svc-nav-mini[open]) .svc-whatsapp{
  opacity:0; transform:scale(.7); pointer-events:none;
}

/* ---- Page-wide particle backdrop: fixed, covers the whole viewport, sits
   behind every section so it stays put ("envolvendo") as the page scrolls
   all the way to the footer, instead of being confined to the hero. A
   solid colour layer sits behind the canvas itself (dots only paint over
   transparent, they don't paint a background). ---- */
/* z-index:0 + DOM order (these two are the first elements in the page),
   not a negative z-index — negative values on a fixed element are
   unreliable once ANY ancestor (body, a layout wrapper, ...) happens to
   establish its own stacking context, which silently hid this entirely. */
/* A faint grid + soft green glow behind the 3D scene — chillbase.net's own
   backdrop treatment — instead of a flat solid colour. Cheap CSS gradients,
   not an image, so this adds no load weight next to the WebGL canvas. */
.svc-page-bg{
  position:fixed; inset:0; z-index:0; background:var(--svc-bg);
  background-image:
    linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px);
  background-size:56px 56px;
}
.svc-page-bg::after{
  content:''; position:absolute; inset:0;
  background: radial-gradient(ellipse 70% 55% at 50% 0%, rgba(34,197,94,.10), transparent 70%);
  pointer-events:none;
}
.svc-hero-canvas{
  position:fixed; inset:0; z-index:0; pointer-events:none; overflow:hidden;
}
.svc-hero-canvas canvas{ display:block; width:100%; height:100%; }

/* ---- Hero: our stacked display headline, now over the page-wide canvas
   rather than its own local copy. ---- */
.svc-hero{
  color:var(--svc-ink);
  padding: 96px 0 40px;
  position:relative;
  z-index:1;
}
.svc-hero .container{ position:relative; z-index:1; }
.svc-h1{
  position:relative;
  margin:0 0 20px; display:flex; flex-direction:column;
  font-size:clamp(42px, 9vw, 88px); font-weight:900; line-height:.98; letter-spacing:-.03em; color:var(--svc-ink);
}
.svc-h1 span{ display:inline-block; }
.svc-hero-sub{ position:relative; margin:0 0 28px; max-width:480px; font-size:15px; line-height:1.5; color:var(--svc-muted); }
.svc-eyebrow{
  font-family:var(--svc-num); font-size:12px; font-weight:700; letter-spacing:.1em; text-transform:uppercase;
  color:var(--svc-muted); margin-bottom:14px; display:flex; align-items:center; gap:6px;
}
.svc-eyebrow-divider{ color:var(--svc-gold); }
/* A soft, directional gradient — not a rectangle — behind the hero text
   block only, so the 3D scene can exist there without competing with the
   headline for contrast. Sits behind the text (negative z-index within
   the container's own stacking context) but above the fixed 3D canvas
   (the container itself is z-index:1, the canvas is z-index:0). */
.svc-hero .container::before{
  content:''; position:absolute; z-index:-1;
  left:-24px; right:30%; top:-40px; bottom:-20px;
  background:radial-gradient(ellipse at 20% 30%, rgba(10,10,12,.55), transparent 72%);
  pointer-events:none;
}

/* ---- Stats row: three equal tiles, chillbase.net-style, instead of one
   inline number next to the headline. ---- */
.svc-stats{
  background:rgba(19,19,22,.82); border-top:1px solid var(--svc-line); border-bottom:1px solid var(--svc-line);
  position:relative; z-index:1; backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px);
}
.svc-stats-row{ display:grid; grid-template-columns:repeat(3,1fr); }
.svc-stat-tile{
  display:flex; flex-direction:column; gap:4px; padding:22px 20px;
  border-left:1px solid var(--svc-line);
  transition: transform .3s var(--svc-ease), background .3s var(--svc-ease);
}
.svc-stat-tile:first-child{ border-left:0; }
@media (hover:hover){
  .svc-stat-tile:hover{ transform:translateY(-3px); background:rgba(34,197,94,.05); }
}
.svc-stat-n{
  font-family:var(--svc-num); font-size:28px; font-weight:700; letter-spacing:-.02em;
  color:var(--svc-gold); text-shadow:0 0 20px var(--svc-gold-glow);
  font-variant-numeric: tabular-nums;
}
.svc-stat-label{ font-size:12px; color:var(--svc-muted); }
@media (max-width:640px){
  .svc-stats-row{ grid-template-columns:1fr; }
  .svc-stat-tile{ border-left:0; border-top:1px solid var(--svc-line); }
  .svc-stat-tile:first-child{ border-top:0; }
}

.svc-search{
  position:relative;
  display:flex; align-items:center; gap:10px;
  background:var(--svc-panel);
  border:1px solid var(--svc-line);
  border-radius:10px;
  padding:13px 16px;
  max-width:480px;
  transition: border-color .18s ease, box-shadow .18s ease;
}
.svc-search:focus-within{ border-color:var(--svc-gold); box-shadow:0 0 0 3px var(--svc-gold-glow); }
.svc-search i.fa-magnifying-glass{ color:var(--svc-muted); font-size:15px; flex:0 0 auto; }
.svc-search input{
  flex:1 1 auto; border:0; outline:0; background:transparent;
  font:inherit; font-size:16px; color:var(--svc-ink); min-width:0;
}
.svc-search input::placeholder{ color:#5c6270; }
.svc-search-clear{
  flex:0 0 auto; border:0; background:rgba(255,255,255,.08); color:var(--svc-muted);
  width:26px; height:26px; border-radius:7px; cursor:pointer;
  display:flex; align-items:center; justify-content:center; font-size:12px;
}

.svc-main-wrap{ position:relative; z-index:1; }
/* padding-bottom used to carry a fixed 110px here specifically to clear the
   old round cart-fab icon — but body.has-cart-fab now reserves that space
   dynamically (and only when the bar is actually showing), so keeping a
   large fixed value here on top of it was stacking into genuinely
   excessive dead space before the footer on every view. */
.svc-main{ padding-top:44px; padding-bottom:40px; }
.svc-section-head{ display:flex; align-items:baseline; gap:10px; margin-bottom:18px; }
.svc-section-label{
  font-weight:800; font-size:16px; letter-spacing:-.01em; color:var(--svc-ink);
  margin:0;
}
.svc-section-badge{
  font-family:var(--svc-num); font-size:11.5px; font-weight:600; color:var(--svc-muted);
  border:1px solid var(--svc-line); border-radius:999px; padding:3px 10px;
}

/* ---- Category list: cinematic editorial chapters (numbered, typographic)
   over the 3D scene, instead of a grid of boxed tiles — one composition
   that scales up on larger screens rather than a separate desktop grid. ---- */
.svc-cat-grid{ display:flex; flex-direction:column; }
.svc-cat-card{
  position:relative;
  appearance:none; border:0; border-top:1px solid var(--svc-line);
  background:transparent; cursor:pointer; width:100%; font:inherit; color:inherit;
  text-align:left; display:flex; flex-direction:column; gap:6px;
  padding:26px 92px 26px 2px; transition: background .25s ease, padding-left .25s var(--svc-ease);
}
.svc-cat-grid .svc-cat-card:last-child{ border-bottom:1px solid var(--svc-line); }
.svc-cat-card:hover, .svc-cat-card:focus-visible{ background:rgba(34,197,94,.05); padding-left:14px; }
.svc-cat-card:focus-visible{ outline: 2px solid var(--svc-gold); outline-offset: -2px; }

/* ---- Two symbols doing two different jobs, layered by z-index:
   1) .svc-cat-icon — a real Font Awesome glyph, small, precise, in the
   corner: the actual literal "what is this category" mark, since the 3D
   tube geometrically can't draw a real briefcase/shield (one continuous
   curve, no sharp corners or disjoint parts — see sculpture.js).
   2) A big per-card 3D badge (sculpture.js, second WebGL canvas painted
   above the cards so the blur doesn't smear it) now sized to roughly fill
   the card and sit BEHIND the text — the bold, alive, scroll-driven
   presence. z-index:3 on the text/icon layer keeps everything legible on
   top of it; the 3D canvas itself sits at z-index:2, above the card's own
   blurred glass (z-index:1 stacking from .svc-main-wrap). */
.svc-cat-icon{
  position:absolute; z-index:3; top:22px; right:20px;
  width:44px; height:44px; display:flex; align-items:center; justify-content:center;
  border-radius:50%; background:rgba(34,197,94,.1); border:1px solid rgba(120,225,173,.3);
  color:var(--svc-gold); font-size:18px;
}
.svc-cat-index, .svc-cat-info, .svc-cat-cta{ position:relative; z-index:3; }
@media(max-width:480px){ .svc-cat-icon{ width:36px; height:36px; top:18px; right:14px; font-size:15px; } }

.svc-cat-index{
  font-family:var(--svc-num); font-size:13px; font-weight:700; color:var(--svc-gold);
  font-variant-numeric: tabular-nums; letter-spacing:.08em;
}
.svc-cat-info{ display:flex; flex-direction:column; gap:6px; }
.svc-cat-title{
  font-weight:900; font-size:clamp(22px, 7.2vw, 30px); letter-spacing:-.02em; color:var(--svc-ink); line-height:1.1;
  overflow-wrap:break-word;
}
.svc-cat-count{ font-size:12.5px; color:var(--svc-muted); font-weight:600; font-variant-numeric: tabular-nums; }
.svc-cat-cta{
  display:inline-flex; align-items:center; gap:8px; margin-top:2px; align-self:flex-start;
  font-size:12px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--svc-gold);
}
.svc-cat-cta i{ font-size:11px; transition: transform .2s var(--svc-spring); }
.svc-cat-card:hover .svc-cat-cta i, .svc-cat-card:focus-visible .svc-cat-cta i{ transform:translateX(4px); }

@media (min-width:980px){
  .svc-cat-title{ font-size:44px; }
  .svc-cat-index{ font-size:14px; }
}

/* ---- Results (search or category) ---- */
.svc-back{
  appearance:none; border:0; background:transparent; cursor:pointer;
  display:inline-flex; align-items:center; gap:8px;
  font:inherit; font-weight:700; font-size:13.5px; color: var(--svc-gold);
  padding:0; margin-bottom:14px;
}
.svc-results-head{ display:flex; align-items:baseline; justify-content:space-between; gap:10px; margin-bottom:14px; flex-wrap:wrap; }
.svc-results-head h2{ margin:0; font-size:20px; font-weight:800; letter-spacing:-.01em; color:var(--svc-ink); }
.svc-results-count{ font-size:12.5px; color:var(--svc-muted); font-weight:600; font-variant-numeric: tabular-nums; }

/* ---- Service results: editorial rows, matching the category list's own
   language (numbered index, hairline rules, no boxed card) instead of a
   grid of SaaS-style tiles. One column at every breakpoint, same as the
   category list, for the same reason: this reads better as a catalogue
   than as e-commerce tiles. ---- */
.svc-service-list:not([hidden]){ display:flex; flex-direction:column; }
.svc-service-row{
  border-top:1px solid var(--svc-line);
  padding:22px 2px; display:flex; gap:16px; align-items:flex-start;
  transition: background var(--motion-normal) var(--ease-out), padding-left var(--motion-normal) var(--ease-out);
}
.svc-service-list .svc-service-row:last-child{ border-bottom:1px solid var(--svc-line); }
/* (hover:hover) gates this to devices with a REAL pointer. Touch browsers
   have a well-known quirk where tapping an element can leave its :hover
   stuck until something else is tapped — without this gate, adding a
   service to the cart (which lands your tap right on this row) would show
   the hover tint permanently afterwards, reading as a fake "selected"
   state that fights with the real one below. :focus-within is unaffected
   by that quirk (touch taps don't trigger it) so it stays active for
   keyboard users. */
@media (hover: hover){
  .svc-service-row:hover{ background:rgba(34,197,94,.05); padding-left:14px; }
}
.svc-service-row:focus-within{ background:rgba(34,197,94,.05); padding-left:14px; }
/* The real selected-row indicator — driven by actual cart membership via
   JS (services.js toggles this the same way it does .svc-add-btn.is-added),
   not by hover. Deliberately restrained: a thin edge + a barely-there tint
   + the index number picking up the accent colour, not a green block. */
.svc-service-row.is-added{
  background: rgba(34,197,94,.04);
  box-shadow: inset 2px 0 0 var(--svc-gold);
}
.svc-service-row.is-added .svc-service-index{ color: var(--svc-gold-light); }
.svc-service-index{
  font-family:var(--svc-num); font-size:13px; font-weight:700; color:var(--svc-gold);
  font-variant-numeric:tabular-nums; letter-spacing:.02em; flex:0 0 auto; padding-top:3px;
}
.svc-service-open{ flex:1 1 auto; min-width:0; cursor:pointer; }
.svc-service-title{ font-weight:800; font-size:17px; letter-spacing:-.008em; line-height:1.3; color:var(--svc-ink); margin-bottom:6px; overflow-wrap:break-word; }
.svc-service-desc{ font-size:13.5px; color:var(--svc-muted); line-height:1.55; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.svc-service-foot{ flex:0 0 auto; display:flex; flex-direction:column; align-items:flex-end; gap:10px; min-width:118px; }
.svc-service-price{ font-family:var(--svc-num); font-weight:700; font-size:15px; color:var(--svc-ink); font-variant-numeric: tabular-nums; white-space:nowrap; }
.svc-service-price .svc-price-tag{ font-family:var(--svc-num); font-size:10.5px; font-weight:600; color:var(--svc-muted); margin-right:4px; }
.svc-service-actions{ display:flex; align-items:center; gap:12px; }
/* Below 640px the horizontal row (index | title/desc | price+actions)
   squeezes the title into a column narrow enough that ordinary Portuguese
   words wrap into unreadable fragments. This is a real structural change,
   not a font-size reduction: the row becomes a vertical stack — index,
   then title/desc at full width, then price, then the actions row — same
   markup, same data-code hooks, just re-flowed. */
@media (max-width: 639px){
  .svc-service-row{ flex-direction: column; align-items: stretch; gap: 10px; }
  .svc-service-foot{ align-items: stretch; width:100%; min-width:0; }
  .svc-service-price{ text-align:left; }
  .svc-service-actions{ width:100%; justify-content:space-between; }
}
/* Padding grows the real tap target toward ~44px; the equal negative
   margin cancels it back out for layout, so the visible text stays exactly
   as compact as before. */
.svc-detail-btn{
  appearance:none; border:0; background:transparent; cursor:pointer;
  padding:13px 4px; margin:-13px -4px;
  font:inherit; font-size:12px; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color:var(--svc-muted); white-space:nowrap; transition:color var(--motion-fast) var(--ease-out);
}
.svc-detail-btn:hover, .svc-detail-btn:focus-visible{ color:var(--svc-gold); }

.svc-btn{
  appearance:none; border:1px solid var(--svc-line); background:rgba(255,255,255,.04); color:var(--svc-ink);
  font:inherit; font-weight:700; font-size:13.5px; cursor:pointer;
  padding:9px 14px; border-radius:8px;
  display:inline-flex; align-items:center; justify-content:center; gap:7px;
  transition: transform .16s var(--svc-spring), background .16s ease, box-shadow .16s ease, border-color .16s ease;
  white-space:nowrap;
}
.svc-btn:hover{ background:rgba(255,255,255,.09); }
.svc-btn:active{ transform: scale(.96); }
.svc-btn-primary{ background:var(--svc-gold); border-color:var(--svc-gold); color:var(--svc-bg); box-shadow:0 6px 18px rgba(34,197,94,.3); }
.svc-btn-primary:hover{ background:var(--svc-gold-light); box-shadow:0 10px 24px rgba(34,197,94,.45); }
/* Green is a selected/success state, not the default appearance of every
   per-item control on the page — a solid green rectangle on every single
   service would flatten the one signal that should feel special. Default
   is typography-driven and dark; hover gives a clear green response;
   selected is the one state that actually earns solid green. */
.svc-add-btn{
  background:transparent; border-color:var(--svc-line); color:var(--svc-ink); font-weight:700;
}
/* (hover:hover) only — on a touch device a tap can leave :hover "stuck" on
   the just-tapped element (no real hover concept exists there), which was
   showing the RED "tap again to remove" tint permanently right after
   selecting a service, reading as an error rather than a success. Gating
   on real pointer capability means touch devices never see it; the ✕ glyph
   below already makes removability clear without relying on hover there. */
@media (hover: hover){
  .svc-add-btn:hover{ border-color:var(--svc-gold); color:var(--svc-gold); background:rgba(34,197,94,.07); }
  .svc-add-btn.is-added:hover{ background:#8a3232; border-color:#8a3232; color:#fff; }
}
.svc-add-btn:focus-visible{ border-color:var(--svc-gold); color:var(--svc-gold); background:rgba(34,197,94,.07); }
.svc-add-btn.is-added{ background:#0f8a45; border-color:#0f8a45; color:#fff; }
.svc-add-btn.is-added:focus-visible{ background:#8a3232; border-color:#8a3232; color:#fff; }
/* The trailing ✕ is always visible (not hover-only) so removability reads
   the same on touch and desktop. */
.svc-add-btn-x{ margin-left:1px; opacity:.85; font-size:.85em; }
.svc-btn-ghost{ background:transparent; }
.svc-btn-ghost:hover{ border-color:var(--svc-muted); background:rgba(255,255,255,.06); }
.svc-btn-block{ width:100%; padding:13px 16px; font-size:14.5px; }

.svc-empty{ text-align:center; padding:50px 16px; color:var(--svc-muted); }
.svc-empty i{ font-size:26px; margin-bottom:10px; opacity:.5; }

/* ---- Overlay + bottom sheets (detail / cart) ---- */
.svc-overlay{
  position:fixed; inset:0; background:rgba(0,0,0,.6); z-index:60;
  animation: svcFade .18s ease;
}
.svc-sheet{
  position:fixed; left:0; right:0; bottom:0; z-index:61;
  background:var(--svc-panel); border:1px solid var(--svc-line); border-bottom:0;
  border-radius:18px 18px 0 0;
  max-height:88vh; overflow-y:auto;
  padding:10px 20px calc(24px + env(safe-area-inset-bottom));
  box-shadow: 0 -20px 60px rgba(0,0,0,.5);
  animation: svcSlideUp .22s var(--svc-spring);
}
/* The visible bar stays thin; ::before enlarges the actual touch target to
   the ~44px minimum without changing how it looks. touch-action:none only
   applies to touches that start on this small strip, so it can never
   interfere with scrolling the sheet body below it. */
.svc-sheet-handle{
  width:40px; height:4px; border-radius:999px; background:var(--svc-line); margin:6px auto 10px;
  position:relative; cursor:grab; touch-action:none;
}
.svc-sheet-handle::before{ content:''; position:absolute; inset:-18px -30px; }
.svc-sheet-close{
  position:absolute; top:14px; right:16px;
  width:30px; height:30px; border-radius:8px; border:0;
  background: rgba(255,255,255,.06); color:var(--svc-muted); cursor:pointer;
}
@keyframes svcFade{ from{opacity:0} to{opacity:1} }
@keyframes svcSlideUp{ from{ transform:translateY(24px); opacity:.6 } to{ transform:translateY(0); opacity:1 } }

.svc-sheet-body{ padding-top:6px; color:var(--svc-ink); }
.svc-detail-eyebrow{ font-size:12.5px; font-weight:700; color:var(--svc-gold); margin-bottom:6px; }
.svc-detail-title{ font-size:21px; font-weight:800; letter-spacing:-.01em; margin:0 0 10px; padding-right:30px; color:var(--svc-ink); }
.svc-detail-desc{ font-size:14.5px; line-height:1.65; color:var(--svc-muted); margin-bottom:18px; }
.svc-detail-price-row{ display:flex; align-items:center; justify-content:space-between; padding:14px 16px; border:1px solid var(--svc-line); border-radius:10px; margin-bottom:16px; }
.svc-detail-price{ font-family:var(--svc-num); font-size:19px; font-weight:700; color:var(--svc-gold); font-variant-numeric: tabular-nums; }
.svc-detail-price-label{ font-size:12px; color:var(--svc-muted); font-weight:650; }

/* ---- Cart ---- */
.svc-cart-head{ display:flex; align-items:center; gap:10px; margin-bottom:16px; }
.svc-cart-head i{ color:var(--svc-gold); font-size:18px; }
.svc-cart-head h3{ margin:0; font-size:18px; color:var(--svc-ink); }
.svc-cart-items:not([hidden]){ display:grid; }
.svc-cart-items{ gap:10px; margin-bottom:6px; }
.svc-cart-item{ display:flex; align-items:center; gap:12px; padding:12px; border:1px solid var(--svc-line); border-radius:10px; }
.svc-cart-item-info{ flex:1 1 auto; min-width:0; }
.svc-cart-item-title{ font-weight:750; font-size:14px; color:var(--svc-ink); }
.svc-cart-item-price{ font-family:var(--svc-num); font-size:13px; color:var(--svc-muted); font-variant-numeric: tabular-nums; margin-top:2px; }
.svc-cart-item-remove{ flex:0 0 auto; width:28px; height:28px; border-radius:8px; border:0; background:rgba(220,38,38,.14); color:#f87171; cursor:pointer; }
.svc-cart-empty{ text-align:center; padding:36px 16px; color:var(--svc-muted); }
.svc-cart-empty i{ font-size:26px; opacity:.5; margin-bottom:10px; }
.svc-cart-empty .svc-btn{ margin-top:16px; }
.svc-cart-footer{ margin-top:14px; padding-top:14px; border-top:1px solid var(--svc-line); }
.svc-cart-total{ display:flex; align-items:baseline; justify-content:space-between; margin-bottom:14px; }
.svc-cart-total span{ font-size:13px; color:var(--svc-muted); font-weight:650; }
.svc-cart-total strong{ font-family:var(--svc-num); font-size:20px; color:var(--svc-gold); font-variant-numeric: tabular-nums; }

/* Sticky bottom order bar — replaces the round floating bag icon, which
   used to sit on top of catalogue content on mobile. Full-width, respects
   the safe area. body.has-cart-fab reserves --request-bar-height of extra
   scroll room at the very end of the page (not just inside the footer) —
   whichever view is open (category list, a category's service list,
   search results), the last item in it can always scroll fully clear of
   the bar, not only the footer text. */
.svc-cart-fab:not([hidden]){ display:flex; }
.svc-cart-fab{
  position:fixed; left:12px; right:12px; bottom:calc(12px + env(safe-area-inset-bottom));
  z-index:50; border:1px solid rgba(34,197,94,.35); border-radius:16px; cursor:pointer;
  background:rgba(15,20,17,.92); backdrop-filter:blur(14px); -webkit-backdrop-filter:blur(14px);
  box-shadow:0 18px 40px rgba(0,0,0,.5), 0 0 0 1px rgba(34,197,94,.08);
  align-items:center; gap:14px; padding:14px 16px; font:inherit; color:inherit;
  max-width:560px; margin:0 auto;
  transition: transform .2s var(--svc-spring), box-shadow .2s ease;
}
.svc-cart-fab:hover{ transform:translateY(-2px); box-shadow:0 22px 46px rgba(0,0,0,.55), 0 0 0 1px rgba(34,197,94,.16); }
.svc-cart-fab-info{ display:flex; align-items:baseline; gap:6px; }
.svc-cart-fab-count{ font-family:var(--svc-num); font-size:16px; font-weight:800; color:var(--svc-gold); font-variant-numeric:tabular-nums; }
.svc-cart-fab-label{ font-size:12px; color:var(--svc-muted); font-weight:600; }
.svc-cart-fab-total{ font-family:var(--svc-num); font-size:15px; font-weight:700; color:var(--svc-ink); font-variant-numeric:tabular-nums; margin-left:auto; }
/* Typography + a subtle accent, not a button sitting inside another
   component — the bar itself is already the component. */
.svc-cart-fab-cta{
  display:flex; align-items:center; gap:7px; font-size:12px; font-weight:800;
  letter-spacing:.05em; text-transform:uppercase; color:var(--svc-gold); white-space:nowrap;
}
.svc-cart-fab-cta i{ transition: transform var(--motion-fast) var(--ease-spring); }
.svc-cart-fab:hover .svc-cart-fab-cta i{ transform:translateX(3px); }

body.has-cart-fab{ padding-bottom: calc(var(--request-bar-height) + env(safe-area-inset-bottom) + 24px); }

.svc-toast:not([hidden]){ display:flex; }
/* Compact on purpose — it's a passing confirmation, not a dialog, and it
   already sits right above a persistent bottom bar on mobile so it must
   stay small enough not to obscure content behind it. */
.svc-toast{
  position:fixed; left:50%; bottom:calc(16px + env(safe-area-inset-bottom));
  transform:translateX(-50%); z-index:70; max-width:calc(100vw - 32px);
  background: var(--svc-panel2); border:1px solid var(--svc-line); color:#fff; font-size:12.5px; font-weight:650;
  padding:8px 12px; border-radius:9px; box-shadow:0 8px 22px rgba(0,0,0,.4);
  align-items:center; gap:6px;
  animation: svcToastIn .2s var(--svc-spring);
  transition: bottom .2s var(--svc-ease);
}
body.has-cart-fab .svc-toast{ bottom:calc(var(--request-bar-height) + 26px + env(safe-area-inset-bottom)); }
.svc-toast i{ color:var(--svc-gold); }
.svc-toast-undo{
  appearance:none; border:0; background:transparent; color:var(--svc-gold);
  font:inherit; font-weight:800; font-size:11.5px; letter-spacing:.02em; text-transform:uppercase;
  cursor:pointer; padding:2px 0 2px 7px; margin-left:1px; border-left:1px solid var(--svc-line);
}
.svc-toast-undo:hover, .svc-toast-undo:focus-visible{ color:var(--svc-gold-light); }
@keyframes svcToastIn{ from{opacity:0; transform:translate(-50%,8px)} to{opacity:1; transform:translate(-50%,0)} }

/* ---- Tablet / desktop ---- */
@media (min-width: 640px){
  .svc-sheet{ left:50%; right:auto; transform:translateX(-50%); width:560px; border-radius:18px; border-bottom:1px solid var(--svc-line); bottom:24px; max-height:82vh; }
  .svc-sheet.svc-cart-sheet{ width:460px; }
  @keyframes svcSlideUp{ from{ transform:translate(-50%,24px); opacity:.6 } to{ transform:translate(-50%,0); opacity:1 } }
}
@media (min-width: 980px){
  .svc-hero-sub{ font-size:16.5px; }
  .svc-hero-stat-n{ font-size:38px; }
  .svc-service-title{ font-size:19px; }
}

/* ---- Reduced motion ---- */
@media (prefers-reduced-motion: reduce){
  .svc-cat-card, .svc-service-row, .svc-btn, .svc-cart-fab, .svc-sheet, .svc-overlay, .svc-toast, .svc-cat-cta i,
  .svc-nav-pill, .svc-stat-tile{
    animation:none !important; transition:none !important;
  }
}

/* ---- RTL ---- */
html[dir="rtl"] .svc-cat-cta i{ transform:scaleX(-1); }
html[dir="rtl"] .svc-back i{ transform:scaleX(-1); }
html[dir="rtl"] .svc-sheet-close{ right:auto; left:16px; }