/* ============================================================
   pronto-intervento24.it — global.css
   HOMEPAGE ONLY.

   Scoped strictly to what index.php, includes/header.php and
   includes/footer.php actually use. Nothing here is kept "in case
   another page needs it".

   Service pages load their own stylesheet:
     /assets/css/elettricista.css, fabbro.css, idraulico.css,
     caldaie.css, condizionatore.css, spurgo.css
   built from service-starter.css.

   Service files must never redefine tokens, .btn or .container —
   they only add sections this file does not have.

   Sections kept:
     0 fonts · 1 tokens · 2 reset · 3 container · 4 typography
     5 buttons · 6 header + mobile nav · 7 hero (split variant)
     8 tile strip · 9 about · 10 feature cards · 11 service cards
     12 FAQ · 13 CTA band · 14 region tabs · 15 coverage map
     16 city link groups · 19 footer · 20 sticky call bar
============================================================ */

/* ============================================================
   0. FONTS — system stack, nothing to download
   Owner's call, 24 Sep 2026. This section used to declare seven
   self-hosted @font-face rules (Archivo 600/700/800/900, Inter
   400/600/700) pointing at /assets/fonts/. That directory has never
   existed: all seven 404'd on every page load, every face sat in
   "error" state, and document.fonts.check() returned false for both
   families — so every page has in fact always rendered in the
   fallback, "Helvetica Neue"/Arial. Verified at request level before
   removing, not assumed (this was _PHASE-6-LOG.md A53).

   Archivo and Inter were the rebuild's own typography choice; the old
   WordPress site never used them either — its pages set
   "font-family: Arial" inline throughout. Removing the rules
   therefore changes nothing on screen and drops seven failed requests
   per page load, which matters on a site that is 85–95% mobile.

   The family names are gone from --font-display/--font-body below
   too, so the tokens say what actually renders. To reinstate the
   intended typography later: drop the seven .woff2 files into
   /assets/fonts/, restore these @font-face rules, and put "Archivo"
   and "Inter" back at the front of those two tokens.

   NOTE: 'Barlow Condensed' was referenced in the old section 13 but
   never loaded either. Removed at the same time.
============================================================ */


/* ============================================================
   1. DESIGN TOKENS  — the only :root in this file
============================================================ */
:root {
  /* --- Brand blues --- */
  --green-950:#1A1B27;  --green-900:#0e395e;  --green-800:#184069;
  --green-700:#2275ac;  --green-500:#2991d6;  --green-100:#e9f5fc;
  --green-050:#f7f8f1;
 
  /* --- Accent oranges --- */
  --amber-600:#F35A00;  --amber-500:#ff5100;  --amber-400:#fb8b4a;
  --amber-050:#f8f7f1;
 
  --gold-500:#d6a243;   --live-500:#28a745;
 
  /* --- Neutrals --- */
  --ink-900:#444444;  --ink-700:#626262;  --ink-500:#a8a8a8;
  --paper-000:#FFFFFF; --paper-050:#FCFCFC;
  --line-200:#EBEBEB; --line-100:#F2F2F2;
 
  /* --- Aliases kept so section 13's markup keeps working.
         Remapped onto the real palette (they previously pointed at a
         separate, unrelated colour set). --- */
  --ink:var(--green-900);
  --ember:var(--amber-500);
  --ember-dark:var(--amber-600);
  --cream:var(--amber-050);
  --line:var(--line-200);
  --paper:var(--paper-000);
 
  /* --- Type ---
     "Archivo"/"Inter" removed from the front of these two stacks on
     24 Sep 2026 along with their @font-face rules (see §0): the files
     never existed, so these are the families that were already
     rendering. The two tokens stay separate even though they now
     resolve identically — every component picks one deliberately, and
     keeping them distinct is what makes reinstating real display/body
     faces later a two-line change. */
  --font-display:"Helvetica Neue",Arial,sans-serif;
  --font-body:"Helvetica Neue",Arial,sans-serif;
  --font-head:var(--font-display);   /* alias, was Barlow Condensed */
 
  /* --- Spacing scale --- */
  --space-3xs:4px;  --space-2xs:8px;  --space-xs:12px;  --space-s:16px;
  --space-m:24px;   --space-l:32px;   --space-xl:48px;  --space-2xl:64px;
 
  /* --- Radius / shadow --- */
  --radius-s:10px; --radius-m:16px; --radius-l:26px;
  --radius:var(--radius-s);          /* alias */
  --shadow-card:0 1px 2px rgba(14,57,94,.06), 0 8px 24px rgba(14,57,94,.08);
  --shadow-pop:0 12px 40px rgba(14,57,94,.16);
  --shadow:var(--shadow-card);       /* alias */
 
  /* --- Layout --- */
  --max-w:1240px;
  --gutter:clamp(20px,5vw,64px);
 
  /* --- Fluid grid defaults. Override per component. --- */
  --col-min:280px;   /* narrowest a column may get before wrapping */
  --gap:var(--space-m);
  --cols-max:99;     /* hard ceiling on columns; 99 = uncapped */
 
  --header-h:88px;
  --logo-h:clamp(48px,12vw,66px);   /* header logo height, also feeds --mega-gap */
  --callbar-h:56px;
}


/* ============================================================
   2. RESET & BASE
============================================================ */
*,*::before,*::after { box-sizing:border-box; margin:0; padding:0; }
 
html { scroll-behavior:smooth; -webkit-text-size-adjust:100%; }
@media (prefers-reduced-motion:reduce){
  html { scroll-behavior:auto; }
  *,*::before,*::after{
    animation-duration:.01ms !important; animation-iteration-count:1 !important;
    transition-duration:.01ms !important; scroll-behavior:auto !important;
  }
}
 
body{
  font-family:var(--font-body);
  color:var(--ink-700);
  background:var(--paper-050);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;           /* belt-and-braces against mobile side-scroll */
}
 
img,svg,video,canvas{ display:block; max-width:100%; }
img,video{ height:auto; }
button,input,select,textarea{ font:inherit; color:inherit; }
button{ cursor:pointer; background:none; border:none; }
a{ text-decoration:none; color:inherit; }
ul,ol{ list-style:none; }
 
/* Long unbroken strings (phone numbers, URLs) must never widen the page */
p,li,td,th{ overflow-wrap:break-word; }
h1,h2:where(:not(.h1-look)),h3,h4,h5,h6,
h2:where(.h1-look){ overflow-wrap:normal; }
 
:target{ scroll-margin-top:calc(var(--header-h) + var(--space-s)); }
 
a:focus-visible,button:focus-visible,[tabindex]:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible,
summary:focus-visible{
  outline:3px solid var(--amber-500);
  outline-offset:3px;
  border-radius:4px;
}


/* ============================================================
   3. LAYOUT PRIMITIVES
   These are the pieces that make item counts irrelevant.
   Use them before writing any new grid CSS.
============================================================ */
 
/* --- Container: never overflows, no media queries needed --- */
.container,.wrap{
  width:min(100% - (var(--gutter) * 2), var(--max-w));
  margin-inline:auto;
}
 

 

 


 

 

 









 


 
section{ padding-block:clamp(56px,8vw,108px); }


/* ============================================================
   4. TYPOGRAPHY
============================================================ */
h1,h2:where(:not(.h1-look)),h3,h4,h5,h6,
/* ============================================================ 4. TYPOGRAPHY ============================================================ */ h2:where(.h1-look){
  font-family:var(--font-display);
  color:var(--ink-900);
  line-height:1.08;
  letter-spacing:-.01em;
  text-wrap:balance;
}
h1,
h2:where(.h1-look){ font-size:clamp(2rem,1.45rem + 2.4vw,3.25rem); font-weight:900; }
h2:where(:not(.h1-look)){ font-size:clamp(1.9rem,1.5rem + 1.8vw,3rem);   font-weight:800; }
h3{ font-size:clamp(1.15rem,1.05rem + .5vw,1.45rem); font-weight:700; }
h4{ font-size:clamp(1.1rem,1.02rem + .4vw,1.3rem);   font-weight:700; }
h5{ font-size:1.1rem; font-weight:700; }
h6{ font-size:1rem;   font-weight:700; }
 
p{ color:var(--ink-700); }
 
.section-kicker{
  display:inline-flex; align-items:center; gap:var(--space-2xs);
  font-family:var(--font-body); font-weight:600; font-size:.95rem;
  color:var(--green-700); margin-bottom:14px;
}
.section-kicker::before{
  content:""; width:8px; height:8px; border-radius:50%;
  background:var(--live-500); flex-shrink:0;
  animation:kicker-pulse 2s ease-out infinite;
}
/* A ring that grows out of the dot and fades. box-shadow does not affect layout,
   so nothing around it moves. The prefers-reduced-motion rule near the top of this
   file already cuts every animation to a single instant for visitors who ask. */
@keyframes kicker-pulse{
  0%  { box-shadow:0 0 0 0 color-mix(in srgb, var(--live-500) 60%, transparent); }
  70% { box-shadow:0 0 0 8px transparent; }
  100%{ box-shadow:0 0 0 0 transparent; }
}
 
 
.visually-hidden{
  position:absolute; width:1px; height:1px; overflow:hidden;
  clip:rect(0 0 0 0); white-space:nowrap;
}

/* head.php emits .skip-link but nothing styled it, so it rendered as a
   plain visible link and pushed the whole page (header included) ~25px
   down. Off-screen until focused, which is what a skip link is for —
   the link, its text and its target are untouched. */
.skip-link{
  position:absolute; left:-9999px; top:0;
  z-index:200;
  background:var(--green-900); color:var(--paper-000);
  padding:10px 18px; border-radius:0 0 var(--radius-s) 0;
  font-weight:700; font-size:.92rem;
}
.skip-link:focus{ left:0; }


/* ============================================================
   5. BUTTONS  — single source of truth
============================================================ */
.btn{
  display:inline-flex; align-items:center; justify-content:center;
  gap:10px;
  font-family:var(--font-body); font-weight:700; font-size:1rem;
  padding:16px 28px;
  border-radius:999px;
  border:2px solid transparent;
  min-height:44px;                     /* tap target — do not remove */
  white-space:nowrap;
  text-align:center;
  transition:transform .15s ease, box-shadow .15s ease,
             background .15s ease, color .15s ease, border-color .15s ease;
}
.btn:active{ transform:scale(.98); }
 
.btn--primary{
  background:var(--amber-500); color:var(--paper-000);
  box-shadow:0 10px 26px rgba(255,81,0,.35);
}
.btn--primary:hover{ background:var(--amber-600); box-shadow:0 14px 30px rgba(255,81,0,.45); }
 


 


 
/* Outlined secondary — pairs with .btn--primary on light backgrounds.
   .btn already reserves a 2px transparent border, so this swaps the
   colour in without changing the button's size. */
.btn--outline{
  background:var(--paper-000);
  color:var(--green-900);
  border-color:var(--green-900);
}
.btn--outline:hover{ background:var(--green-100); }

/* Ghost — a plain text link for a secondary action that must not
   compete with .btn--primary (e.g. "Vedi i prezzi" beside "Chiama
   subito"). No fill, no border, tighter padding: just coloured text
   with its icon, so attention stays on the primary button beside it.
   min-height:44px still comes from .btn, so the tap target holds. */
.btn--ghost{
  padding:8px 4px;
  background:none;
  border-color:transparent;
  box-shadow:none;
  color:var(--ink-700);
  text-decoration:underline;
  text-decoration-color:transparent;
  text-underline-offset:4px;
}
.btn--ghost:hover{ color:var(--green-900); text-decoration-color:currentColor; }
.btn--ghost svg{ width:18px; height:18px; }

/* Was referenced by .about__content but never defined. */
.btn--white{ background:var(--green-900); color:var(--paper-000); }
.btn--white:hover{ background:var(--green-800); color:var(--paper-000); }
 


 
.btn--lg{ padding:20px 40px; font-size:1.15rem; }

 
.icon-phone{ width:20px; height:20px; flex-shrink:0; }
 
/* On phones a lone primary button should fill the width */
@media (max-width:600px){
  .btn--lg{ width:100%; padding:17px 24px; font-size:1.05rem; }
}

/* Very small phones (320px class): long labels such as "Chiama Subito
   Pronto Intervento Elettricista 24" no longer fit on one line, so
   buttons may wrap and long words in headings may break instead of
   pushing the page wider than the screen. */
@media (max-width:359px){
  .btn{ white-space:normal; max-width:100%; line-height:1.25; }
  h1,h2:where(:not(.h1-look)),h3,h4,
h2:where(.h1-look){ overflow-wrap:anywhere; }
}


/* ============================================================
   6. HEADER + MOBILE NAV
============================================================ */
.site-header{
  position:sticky; top:0; z-index:130;
  background:rgba(255,255,255,.92);
  backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line-200);
}
.site-header__inner{
  display:flex; align-items:center; justify-content:space-between;
  flex-wrap:nowrap;
  gap:clamp(8px,2vw,var(--space-s));
  padding-block:10px;
  min-width:0;
}
.site-logo{ flex-shrink:0;
  font-family:var(--font-display); font-weight:800; font-size:1.15rem;
  color:var(--green-950); display:flex; align-items:center; gap:10px;
  min-width:0; flex:0 1 auto;
}
/* Logo size. Was 44px, then 52px with the header held at 72px; the owner
   still found it small, so the header is now allowed to grow with it:
   66px logo + 2 x 10px padding + 1px border = ~87px on desktop, ~69px
   on a phone (48px logo, still taller than the 44px hamburger). The file
   is 275x101, so it stays sharp well past this. */
.site-logo img{ height:var(--logo-h); width:auto; flex-shrink:0; max-width:none; }
 
.site-nav{ display:none; }
.site-nav__list{
  display:flex;
  list-style:none; margin:0; padding:0;
  gap:clamp(16px,2vw,28px);
  font-weight:600; font-size:.95rem; color:var(--ink-700);
}
.nav-item > a{ padding-block:4px; white-space:nowrap; }
.nav-item > a:hover,.nav-item > a[aria-current="page"]{ color:var(--green-900); }

/* --- Mega-menu trigger (caret) — shown on mobile only; desktop opens
   the panel on hover/focus, see the ≥900px block below --- */
.nav-item__toggle{
  display:none;
  border:0; background:none; padding:0; margin:0; color:inherit; cursor:pointer;
}
.nav-item__caret{
  display:block; width:8px; height:8px;
  border-right:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:rotate(45deg);
  transition:transform .2s ease;
}
/* Scoped to the service's own toggle — a plain descendant selector here
   outranks the region-chevron rule below and flips all of those too. */
.nav-item.is-open > .nav-item__toggle .nav-item__caret{ transform:rotate(-135deg); }

/* --- Mega-menu — one panel, two panes: a single column of region
   names, and the active region's cities beside it. Only one region's
   cities are ever rendered visible, so the panel never shows more than
   ~15 links at once and never grows with the service's total size.
   Positioning differs per breakpoint — see the two blocks below. --- */
.mega-menu__regions{ list-style:none; margin:0; padding:0; }
.mega-region__toggle{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  width:100%; text-align:left;
  border:0; border-radius:8px; background:none; padding:5px 10px; margin:0;
  font-family:var(--font-display); font-weight:600; font-size:.82rem;
  line-height:1.35; color:var(--green-900); cursor:pointer;
  transition:background .14s ease, color .14s ease;
}
.mega-region__toggle:hover{ background:var(--green-050); }
.mega-region.is-active > .mega-region__toggle{
  background:var(--amber-050); color:var(--amber-600);
}
.mega-region__toggle .nav-item__caret{
  opacity:.45; transform:rotate(-45deg); transition:opacity .14s ease;
}
.mega-region.is-active > .mega-region__toggle .nav-item__caret{ opacity:1; }

/* --- A region that is a page of its own: link + caret, two targets.

   The row splits so one tap means one thing on a phone — the name
   navigates, the caret opens the sub-list. On desktop it makes no odds,
   because the panel opens on hover over the whole row.

   The pair has to look identical to the single-button rows above it, so
   the <li> takes over the flex layout the button used to do, and the
   link and caret inherit the same type, padding and rounding. The
   highlight (hover, active, you-are-here) moves to the <li> too, so it
   spans the whole row rather than lighting only the half the pointer
   happens to be over. --- */
.mega-region--linked{
  display:flex; align-items:center; gap:4px;
  border-radius:8px;
  transition:background .14s ease;
}
.mega-region--linked:hover{ background:var(--green-050); }
.mega-region--linked.is-active{ background:var(--amber-050); }

/* Written as ".mega-menu a.mega-region__link" — 0,2,1 — for the same
   reason .mega-menu__title--link is (see the note further down): the
   later ".mega-menu a" rule is 0,1,1 and would otherwise win on source
   order, dropping this row to 500 weight and --ink-700. The linked rows
   then rendered visibly lighter and thinner than the plain ones beside
   them, which is exactly what the row must NOT do — it has to look like
   every other region in the list. */
.mega-menu a.mega-region__link{
  display:block;
  flex:1 1 auto; min-width:0;
  padding:5px 4px 5px 10px;
  font-family:var(--font-display); font-weight:600; font-size:.82rem;
  line-height:1.35; color:var(--green-900); text-decoration:none;
}
.mega-region--linked.is-active > a.mega-region__link{ color:var(--amber-600); }
.mega-menu a.mega-region__link:hover{ color:var(--amber-600); }

/* The caret keeps a 44px-wide tap target even though the glyph is tiny —
   it is the only way into the sub-list on a phone. */
.mega-region__toggle--caret{
  flex:0 0 auto;
  width:auto; min-width:34px;
  justify-content:center;
  padding:5px 10px 5px 4px;
  background:none;
}
.mega-region--linked:hover > .mega-region__toggle--caret,
.mega-region--linked.is-active > .mega-region__toggle--caret{ background:none; }

.mega-region__panel{ display:none; }
.mega-region__panel.is-active{ display:block; }
.mega-menu__title{
  font-family:var(--font-display); font-weight:700; font-size:.72rem;
  color:var(--ink-700); text-transform:uppercase; letter-spacing:.06em;
  margin:0 0 10px;
}
@media (min-width: 900px) {
  .mega-region__panel:not(.mega-region__panel--solo) .mega-menu__title {
    display: none;
  }
}
/* Six regions are pages of their own, so their panel heading is an <a>
   instead of a <p>. It has to keep reading as the heading of the list
   below it while showing it can be clicked, so it carries the same type
   as the <p> version and adds only an underline that warms on hover.

   Written as ".mega-menu a.mega-menu__title--link" — 0,2,1 — on purpose.
   Two later rules would otherwise win on source order at 0,1,1:
   ".mega-menu a" (weight 500) and, inside the desktop block,
   ".mega-menu__pane--cities a" (font-size .95rem). At plain
   "a.mega-menu__title--link" this heading rendered at 15.2px/500 and read
   as another city row instead of the heading above them. */
.mega-menu a.mega-menu__title--link{
  display:inline-block;
  padding:0;
  font-family:var(--font-display); font-weight:700; font-size:.72rem;
  line-height:inherit;
  color:var(--ink-700); text-transform:uppercase; letter-spacing:.06em;
  text-decoration:underline;
  /* --line-200 was invisible here: it is a border tint, and against the
     panel's own background the underline simply did not read, so the
     heading looked identical to the six that are not links. --ink-500 is
     the faintest token that still shows at 11.5px. */
  text-decoration-color:var(--ink-500);
  text-underline-offset:3px;
  transition:color .14s ease, text-decoration-color .14s ease;
}
.mega-menu a.mega-menu__title--link:hover{
  color:var(--amber-600);
  text-decoration-color:var(--amber-500);
}
/* On the region's own page the heading is the "you are here" marker. */
.mega-menu a.mega-menu__title--link[aria-current="page"]{
  color:var(--amber-600);
  text-decoration-color:var(--amber-500);
}

/* A region with no cities under it — Valle d'Aosta, in three services.
   Its pane holds the heading and nothing else, and at heading size that
   read as a caption stranded above an empty list rather than as the one
   thing there to click. Here the heading takes the type of a city row
   instead, because functionally that is what it is: the single
   destination in this pane. No wording changes, only its size. */
.mega-region__panel--solo a.mega-menu__title--link{
  font-family:var(--font-body);
  font-size:.95rem;
  font-weight:500;
  text-transform:none;
  letter-spacing:normal;
  padding:7px 0;
}

.mega-region__panel ul{ list-style:none; margin:0; padding:0; }

/* Sub-heading inside a grouped panel — "Apertura Porte" is the only region
   that has any. Its seven groups were each a top-level row in the old menu;
   they are one row now, so their names sit over their own links here.

   Deliberately lighter than .mega-menu__title above it: that one names the
   whole panel, these divide it, and if both shouted the panel would read as
   eight competing headings rather than one heading with sections. Same
   uppercase display type at a smaller size and a softer colour, so the
   hierarchy is legible at a glance.

   No top margin on the first one — .mega-menu__title already leaves 10px
   under itself, and doubling that detached the first group from the heading
   it belongs to. */
.mega-menu__subtitle{
  font-family:var(--font-display); font-weight:700; font-size:.66rem;
  color:var(--ink-500); text-transform:uppercase; letter-spacing:.05em;
  margin:14px 0 4px;
}
.mega-region__panel > .mega-menu__subtitle:first-of-type{ margin-top:0; }
.mega-menu a{
  display:block; padding:4px 0; font-weight:500; font-size:.85rem;
  line-height:1.4; color:var(--ink-700); white-space:normal;
}
.mega-menu a:hover{ color:var(--amber-600); }

/* --- You-are-here.

   On a city page the menu marks the whole path down to it: the service
   in the top bar, that service's region in the left pane, and the city
   itself. header.php also opens the panel on the visitor's own region
   rather than always the first, so the list they need is the one
   showing when the panel appears.

   .is-current is deliberately a different class from .is-active, which
   hover drives: moving the pointer to another region must swap which
   cities show WITHOUT erasing the marker saying where you actually
   are. The two can sit on the same region at once, and the rules below
   are written so that reads correctly either way.

   These rules must stay AFTER the .nav-item and .mega-menu rules
   above. Several of them tie on specificity with the hover and
   [aria-current] rules, so source order is what decides. --- */
.nav-item.is-current > a{
  position:relative;
  color:var(--amber-600);
}
.nav-item.is-current > a::after{
  content:"";
  position:absolute; left:0; right:0; bottom:-3px;
  height:2px; border-radius:2px;
  background:var(--amber-500);
}

.mega-region.is-current > .mega-region__toggle,
.mega-menu .mega-region.is-current > a.mega-region__link{
  color:var(--amber-600);
  font-weight:700;
}
/* Current AND hovered-off: keep the orange text, drop the fill so the
   region the pointer is on is still the one that looks selected. */
.mega-region.is-current:not(.is-active) > .mega-region__toggle{
  background:none;
}
.mega-region--linked.is-current:not(.is-active){ background:none; }

.mega-menu a.is-current{
  color:var(--amber-600);
  font-weight:700;
}

/* Back bar — mobile-only "drill-down" navigation; desktop shows both
   panes at once, so there is nothing to go back from. */
.mega-menu__back{
  display:none;
  align-items:center; gap:10px;
  border:0; border-radius:8px; background:var(--green-050);
  padding:11px 12px; margin:0 0 12px;
  font-family:var(--font-display); font-weight:700; font-size:.88rem;
  color:var(--green-900); cursor:pointer; width:100%; text-align:left;
}
.mega-menu__back-caret{
  display:block; width:8px; height:8px; flex-shrink:0;
  border-left:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:rotate(45deg);
}

/* z-index sits above the mobile drawer (120) on purpose: the drawer is
   fixed from the very top of the viewport, so without this it paints
   over the hamburger and there is no visible way to close the menu. */
.site-header__call{
  display:flex; align-items:center;
  gap:clamp(6px,1.6vw,10px);
  flex-shrink:0; min-width:0;
  position:relative; z-index:125;
}
/* Iscriviti / Login. Two text buttons where the phone block and the
   call CTA used to be, so they have to share the room one button and a
   number had. Tighter padding, and nowrap so neither label ever breaks
   across two lines and grows the header. */
.site-header__cta{
  padding:11px 18px; font-size:.9rem;
  white-space:nowrap;
}

/* Mobile-drawer copy of the two buttons above (see header.php). Hidden
   here; the ≤899px block below turns it on and hides .site-header__cta's
   pair in its place, so exactly one pair is ever visible at once. */
.site-nav__actions{ display:none; }

/* --- Hamburger --- */
.nav-toggle{
  display:inline-flex; align-items:center; justify-content:center;
  width:44px; height:44px; border-radius:12px;
  border:1px solid var(--line-200); background:#fff; color:var(--green-900);
  flex-shrink:0;
}
.nav-toggle__bars,
.nav-toggle__bars::before,
.nav-toggle__bars::after{
  content:""; display:block; width:20px; height:2px;
  background:currentColor; border-radius:2px;
  transition:transform .2s ease, opacity .2s ease, background .2s ease;
}
.nav-toggle__bars{ position:relative; }
.nav-toggle__bars::before{ position:absolute; top:-6px; }
.nav-toggle__bars::after { position:absolute; top:6px; }
.nav-toggle[aria-expanded="true"] .nav-toggle__bars{ background:transparent; }
.nav-toggle[aria-expanded="true"] .nav-toggle__bars::before{ transform:translateY(6px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] .nav-toggle__bars::after { transform:translateY(-6px) rotate(-45deg); }
 
/* --- Backdrop --- */
.nav-backdrop{
  position:fixed; inset:0; z-index:110;
  background:rgba(26,27,39,.45);
  opacity:0; transition:opacity .25s ease;
}
.nav-backdrop.is-open{ opacity:1; }
.nav-backdrop[hidden]{ display:none; }
 
/* ============================================================
   MOBILE — below 900px
   backdrop-filter is removed here on purpose: an element with
   backdrop-filter becomes the containing block for its fixed-position
   descendants, which would trap the drawer inside the header.
============================================================ */
@media (max-width:899px){
  .site-header{
    backdrop-filter:none;
    background:var(--paper-000);
  }
 
  /* Starts below the header rather than at the top of the viewport, so
     the header stays a whole, un-clipped bar with its close button in
     its normal place instead of the drawer sliding over the top of it.
     --header-bottom is measured by site.js; the static --header-h
     fallback is short of the header's actual rendered height. */
  .site-nav{
    position:fixed; inset:var(--header-bottom,var(--header-h)) 0 0 auto;
    width:min(86vw,340px);
    display:block;
    background:var(--paper-000);
    padding:var(--space-s) var(--space-m) var(--space-xl);
    box-shadow:var(--shadow-pop);
    border-top:1px solid var(--line-200);
    transform:translateX(100%);
    transition:transform .25s ease;
    overflow-y:auto;
    overscroll-behavior:contain;
    z-index:120;
  }
  .site-nav.is-open{ transform:translateX(0); }

  .site-nav__list{ flex-direction:column; gap:0; }
  .nav-item{ position:relative; border-bottom:1px solid var(--line-100); }
  .nav-item.has-mega > a{ padding-right:52px; }

  .nav-item > a{
    display:flex; align-items:center; min-height:52px;
    padding:var(--space-xs) 0;
    font-size:1.02rem; font-weight:700; color:var(--green-900);
    white-space:normal;
  }
  /* An open service stays visibly marked while you're inside it. */
  .nav-item.is-open > a{ color:var(--amber-600); }

  /* Tap-to-expand accordion — hover doesn't exist on touch. Tapping the
     service reveals its region list; tapping a region swaps to its
     cities as a second screen with a back bar, instead of nesting
     everything inline into a wall of indented rows. */
  .nav-item__toggle{
    display:flex; align-items:center; justify-content:center;
    position:absolute; top:0; right:-4px;
    width:52px; height:52px;
    border-radius:10px;
    color:var(--green-900);
  }
  .nav-item.is-open .nav-item__toggle{
    background:var(--amber-050); color:var(--amber-600);
  }

  .mega-menu{
    display:grid; grid-template-rows:0fr;
    transition:grid-template-rows .25s ease;
  }
  .mega-menu__panel{ overflow:hidden; min-height:0; }
  .nav-item.is-open .mega-menu{ grid-template-rows:1fr; }

  /* Inset + tinted so an open sub-level reads as "inside" its service
     rather than as more top-level rows. */
  .mega-menu__pane{
    padding:var(--space-xs);
    margin-bottom:var(--space-xs);
    background:var(--green-050);
    border-radius:var(--radius-s);
  }
  .mega-region__toggle{
    min-height:44px; font-size:.95rem; padding:8px 10px;
  }
  .mega-region__toggle .nav-item__caret{ opacity:.6; }

  /* Split rows on a phone: both halves get their own 44px target, and a
     hairline between them so it reads as two things to tap rather than
     one wide one. Without it a thumb aiming for the caret lands on the
     link and navigates away instead of opening the sub-list. */
  .mega-menu a.mega-region__link{
    min-height:44px; display:flex; align-items:center;
    font-size:.95rem; padding:8px 4px 8px 10px;
  }
  .mega-region__toggle--caret{
    min-height:44px; min-width:44px;
    padding:8px 10px;
    border-left:1px solid var(--line-200);
    border-radius:0 var(--radius-s) var(--radius-s) 0;
  }

  .mega-menu__pane--cities{ display:none; }
  .mega-menu.is-drilled .mega-menu__pane--regions{ display:none; }
  .mega-menu.is-drilled .mega-menu__pane--cities{ display:block; }
  .mega-menu__back{ display:flex; background:var(--paper-000); }
  .mega-menu__title{ padding-inline:10px; }
  .mega-menu a{ padding:9px 10px; font-size:.95rem; }

  body.nav-open{ overflow:hidden; }

  /* Iscriviti/Login move into the drawer below 899px, so the header bar
     itself only ever has to fit the logo and the hamburger — this is what
     replaces the old shrink-the-buttons rules that used to live below 620
     and 430px (removed; the buttons they targeted no longer render on
     that path at all, so there was nothing left for them to do). */
  .site-header__cta{ display:none; }
  .site-nav__actions{
    display:flex; gap:10px;
    margin-top:var(--space-m);
    padding-top:var(--space-m);
    border-top:1px solid var(--line-200);
  }
  /* Tightened from the .btn base (16px 28px, 1rem): the drawer is
     min(86vw,340px) wide with 24px of side padding, so two equal-width
     pills split ~292px minus the 10px gap between them. At the base size
     "Iscriviti" — the longer label — was tight against wrapping. */
  .site-nav__actions .btn{
    flex:1 1 0; min-width:0;
    padding:12px 14px; font-size:.92rem;
    white-space:nowrap;
  }
}

@media (min-width:900px){
  .site-nav{ display:flex; }
  .nav-toggle{ display:none; }
  .nav-backdrop{ display:none; }

  /* Hover/focus flyout.

     Anchored to the nav LIST, not to the individual nav item, and made
     wider than that list — so there is always panel directly beneath
     whichever service you're pointing at, and the panel's left edge is
     identical for all six (it can't walk off the right of the screen).

     --mega-gap is the dead strip between the bottom of a nav link and
     the top of the panel: half the row's spare height around the 24px nav line,
     (max(logo, 44px) - 24px) / 2, plus .site-header__inner's 10px padding-block plus
     the header's 1px bottom border. ::before re-covers exactly that
     strip, so moving the cursor straight down from a nav link never
     leaves :hover and the panel can't flicker shut mid-travel. */
  .site-nav__list{ position:relative; }
  .nav-item{ position:static; }
  /* Padding on an inline <a> grows the hover target without changing
     the header's height, so there's more to aim at on the way down. */
  .nav-item > a{ padding-block:10px; }

  .mega-menu{
    --mega-gap:calc((max(var(--logo-h),44px) - 24px) / 2 + 11px);
    position:absolute; top:calc(100% + var(--mega-gap)); left:0;
    width:min(640px,calc(100vw - 2 * var(--gutter)));
    background:var(--paper-000);
    border:1px solid var(--line-200);
    border-radius:var(--radius-m);
    box-shadow:var(--shadow-pop);
    /* No pointer-events here on purpose. visibility:hidden already makes
       the closed panel unclickable, and unlike pointer-events it is a
       transitioned property — so it stays "visible" (and therefore
       interactive) for the whole grace period below. With
       pointer-events:none the panel went inert the instant :hover was
       lost: still on screen, but the mouse fell through it to the page
       behind, so moving back onto it could not reopen it and the delay
       bought nothing. */
    opacity:0; visibility:hidden;
    transform:translateY(-4px);
    /* --mega-close-delay is a grace period on the CLOSING direction
       only: this rule is what applies once :hover is lost, so the delay
       here keeps the panel up while the cursor cuts a corner or crosses
       a gap. The :hover rule below zeroes it, so opening stays instant. */
    --mega-close-delay:.3s;
    transition:
      opacity .15s ease var(--mega-close-delay),
      transform .15s ease var(--mega-close-delay),
      visibility .15s var(--mega-close-delay);
    z-index:150;
  }
  .mega-menu::before{
    content:"";
    position:absolute; left:0; right:0;
    top:calc(-1 * var(--mega-gap)); height:var(--mega-gap);
  }
  .nav-item.has-mega:hover .mega-menu,
  .nav-item.has-mega:focus-within .mega-menu{
    opacity:1; visibility:visible;
    transform:translateY(0);
    --mega-close-delay:0s;              /* opens with no lag */
  }

  .mega-menu__panel{ display:flex; align-items:stretch; }

  /* One plain column of regions. Width is set so the longest names
     ("Apertura Porte Emilia – Romagna") stay on one line — wrapped rows
     were what pushed Fabbro's 20 regions past the cap into a scrollbar. */
  .mega-menu__pane--regions{
    /* Width is set so the longest name stays on one line AT THE SIZE
       ABOVE — 268px was right at .82rem and wraps "Apertura Porte
       Emilia – Romagna" at .9rem. A wrapped row is not just untidy: it
       costs a row's height in a column already capped for scrolling. */
    flex:0 0 296px;
    padding:10px;
    /* Raised with the type below. Measured from the space actually left
       under the header rather than a flat vh share, so the panel can't
       run past the bottom of a short window. Fabbro is the worst case:
       21 regions at 27px a row is 567px, so they fit down to roughly a
       730px-tall window and scroll below that. */
    max-height:min(calc(100vh - 120px),660px);
    overflow-y:auto;
  }
  /* Desktop type: larger than the mobile drawer's, and with real space
     between rows — these are pointing targets, not a dense list.

     The vertical padding is 4px, not 5px, because restoring Fabbro
     Valle d'Aosta took the fabbro menu from 20 regions to 21 (see
     _PHASE-6-LOG.md A15) and a 21st row at the old height pushed the
     column past the cap above, bringing the scrollbar back at window
     heights where it used to fit. 2px off each row buys back 42px,
     more than the 29px the new row costs, so 21 regions now clear the
     cap in slightly LESS height than 20 used to.

     This affects the desktop column only. The mobile drawer sets its
     own min-height:44px in the <=900px block and is untouched.

     The linked rows (a link plus a caret button) take the same size and
     vertical padding, so a row that happens to be a page of its own is
     indistinguishable from the rest of the column. Only the horizontal
     padding differs, because the row's 10px is split between the two
     halves instead of sitting on one element. */
  .mega-region__toggle{
    padding:4px 10px;
    font-size:.9rem;
  }
  .mega-menu a.mega-region__link{
    padding:4px 4px 4px 10px;
    font-size:.9rem;
  }
  .mega-region__toggle--caret{
    padding:4px 10px 4px 4px;
  }

  /* The cities for whichever region is pointed at. 15 is the most any
     one region has, which is well inside the cap. */
  .mega-menu__pane--cities{
    flex:1 1 auto; min-width:0;
    padding:16px 20px;
    border-left:1px solid var(--line-100);
    background:var(--paper-050);
    border-radius:0 var(--radius-m) var(--radius-m) 0;
    max-height:min(calc(100vh - 120px),660px);
    overflow-y:auto;
  }
  .mega-menu__pane--cities a{
    font-size:.95rem;
    padding:7px 0;
  }

  .mega-menu__back{ display:none; }
}


/* ============================================================
   7b. HERO — .hero--split variant
   APPEND THIS AT THE END OF SECTION 7 IN global.css
   (immediately before the "8. SERVICE TILE STRIP" comment)

   Two-column hero: copy left, photo right with floating stat cards.
   Overrides the photo-background hero without touching it, so the
   homepage's existing .hero and .hero--compact keep working.

   Selectors use .hero.hero--split (0,3,0) rather than .hero--split
   (0,2,0) so they beat the base .hero .hero__grid rules regardless
   of where this block ends up in the file.
============================================================ */

.hero.hero--split{
  position:relative;
  overflow:hidden;
  background:var(--green-050);
  padding-block:clamp(28px,5vw,72px);
  color:var(--ink-700);
}

/* Was a decorative gradient wash (purely visual, aria-hidden in
   markup) — removed in favour of the hero's own flat --green-050
   background. The element stays in the markup, just unrendered, so
   nothing else needs to change. */
.hero--split .hero__shape{ display:none; }

/* Reset everything the photo-hero set on the grid */
.hero.hero--split .hero__grid{
  position:relative;
  z-index:1;
  width:min(100% - (var(--gutter) * 2), var(--max-w));
  margin-inline:auto;
  padding-inline:0;
  padding-block:0;
  min-height:0;
  background-image:none;
  background-color:transparent;
  border-radius:0;
  box-shadow:none;
  display:grid;
  gap:clamp(32px,5vw,64px);
  align-items:center;
  grid-template-columns:minmax(0,1fr);
}
@media (min-width:980px){
  .hero.hero--split .hero__grid{
    grid-template-columns:minmax(0,1.02fr) minmax(0,.98fr);
    gap:clamp(40px,5vw,80px);
  }
}

/* The copy is no longer a card sitting on a photo */
.hero.hero--split .hero__copy{
  background:transparent;
  box-shadow:none;
  border-radius:0;
  margin:0;
  padding:0;
  display:block;
}

.hero--split .hero__copy .section-kicker{ margin-bottom:16px; }

/* One hero title treatment for every page on this banner: same size,
   always capitals. text-transform rather than retyped copy, so a title
   written in sentence case in the source still reads as capitals and
   the source words stay untouched. Service stylesheets must not
   override the size — the longer titles simply wrap onto more lines. */
.hero.hero--split h1,
.hero.hero--split .hero__headline,
/* One hero title treatment for every page on this banner: same size, always capitals. text-transform rather than retyped copy, so a title written in sentence case in the source still reads as capitals and the source words stay untouched. Service stylesheets must not override the size — the longer titles simply wrap onto more lines. */ .hero.hero--split h2:where(.h1-look){ text-transform:uppercase; }
.hero.hero--split h1,
.hero.hero--split h2:where(.h1-look){
  font-size:clamp(2.1rem,1.4rem + 3vw,3.6rem);
  line-height:1.02;
  letter-spacing:-.02em;
}
/* Orange highlight inside the H1 */
.hero h1 .accent,
/* Orange highlight inside the H1 */ .hero h2:where(.h1-look) .accent{ color:var(--amber-500); }

.hero.hero--split .hero__sub{
  margin-top:16px;
  max-width:44ch;
}

.hero.hero--split .hero__actions{
  margin-top:26px;
  padding-top:0;
  border-top:0;
  max-width:none;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--space-xs);
}
/* One per row on phones, so neither button gets squeezed. */
@media (max-width:480px){
  .hero.hero--split .hero__actions{ flex-direction:column; align-items:stretch; }
}

/* --- Trust list: any number of items, 1 col on phones, 2 above --- */
.hero__trust{
  display:grid;
  gap:10px var(--space-m);
  grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));
  margin-top:28px;
  padding-top:24px;
  border-top:1px solid var(--line-200);
  max-width:520px;
}
.hero__trust li{
  display:flex; align-items:center; gap:10px;
  font-size:.95rem; font-weight:600; color:var(--green-900);
  line-height:1.3;
}
.hero__trust svg{
  width:20px; height:20px; flex-shrink:0;
  color:var(--live-500);
}

/* ============================================================
   Visual column
   Mobile: image + stats flow as a grid, no absolute positioning.
   Desktop: stats float over the image corners.
============================================================ */
.hero.hero--split .hero__visual{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(min(150px,100%),1fr));
  gap:var(--space-2xs);
  position:relative;
  padding:0;
  align-items:stretch;
  justify-content:initial;
}

/* Landscape on purpose — wider than tall. object-fit:cover means a
   portrait source file gets cropped top and bottom to fit this box. */
.hero__img{
  grid-column:1 / -1;
  width:100%;
  height:auto;
  aspect-ratio:4/3;
  object-fit:cover;
  border-radius:var(--radius-l);
  box-shadow:var(--shadow-pop);
  margin-bottom:var(--space-2xs);
}

.hero__stat{
  display:flex; flex-direction:column; gap:2px;
  padding:14px 16px;
  background:var(--paper-000);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  box-shadow:var(--shadow-card);
}
.hero__stat-num{
  font-family:var(--font-display);
  font-weight:800;
  font-size:clamp(1.15rem,1.05rem + .5vw,1.5rem);
  line-height:1.1;
  color:var(--green-900);
  letter-spacing:-.01em;
}
.hero__stat-num sup{
  font-size:.55em; vertical-align:super;
  color:var(--amber-500); margin-left:1px;
}
.hero__stat-label{
  font-size:.78rem; font-weight:600;
  color:var(--ink-500); line-height:1.25;
}
.hero__stat--a .hero__stat-num{ color:var(--amber-600); }

@media (min-width:980px){
  .hero.hero--split .hero__visual{
    display:block;
    padding:0 clamp(12px,2vw,28px);
  }
  .hero__img{
    aspect-ratio:4/3;
    margin-bottom:0;
  }
  .hero__stat{
    position:absolute;
    z-index:2;
    min-width:150px;
    padding:15px 18px;
    backdrop-filter:blur(6px);
    background:rgba(255,255,255,.94);
  }
  /* Tucked slightly outside the photo: it's landscape, so it's much
     shorter than a portrait one and inset cards would crowd it. */
  .hero__stat--a{ top:-4%;    left:-2%;  }
  .hero__stat--d{ bottom:-6%; right:-2%; }
}

/* Tall-but-narrow desktops: pull the cards in so they don't collide */
@media (min-width:980px) and (max-width:1180px){
  .hero__stat{ min-width:132px; padding:12px 14px; }
  .hero__stat--a{ left:-2%; }
}

@media (max-width:420px){
  .hero.hero--split .hero__visual{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .hero__stat{ padding:12px 13px; }
  .hero__stat-label{ font-size:.73rem; }
}

/* ============================================================
   8. SERVICE TILE STRIP  — now any number of tiles
============================================================ */
.tile-strip{ background:var(--green-050); padding-block:clamp(36px,5vw,64px); }
 
.tile-strip__grid{
  --col-min:140px;
  --gap:clamp(12px,1.4vw,16px);
  --cols-max:6;                  /* raise or lower per page if needed */
  display:grid;
  gap:var(--gap);
  grid-template-columns:repeat(
    auto-fit,
    minmax(
      max(min(var(--col-min),100%),
          (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),
      1fr
    )
  );
}
 
.tile{
  position:relative; isolation:isolate; overflow:hidden;
  display:flex; flex-direction:column; align-items:center;
  gap:14px; padding:26px 12px 22px;
  background:var(--paper-000);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  box-shadow:var(--shadow-card);
  text-align:center;
  height:100%;                   /* equal heights at any count */
  transition:transform .22s cubic-bezier(.2,.7,.3,1),
             box-shadow .22s cubic-bezier(.2,.7,.3,1),
             border-color .22s ease;
}
.tile::before{
  content:""; position:absolute; inset-inline:0; top:0; height:3px;
  background:linear-gradient(90deg,var(--amber-500),var(--amber-400));
  transform:scaleX(0); transform-origin:left;
  transition:transform .28s cubic-bezier(.2,.7,.3,1);
}
.tile:hover,.tile:focus-within{
  transform:translateY(-4px); border-color:transparent; box-shadow:var(--shadow-pop);
}
.tile:hover::before,.tile:focus-within::before{ transform:scaleX(1); }
 
.tile__media{
  display:grid; place-items:center;
  width:clamp(64px,9vw,84px); height:clamp(64px,9vw,84px);
  border-radius:50%; background:var(--green-100);
  transition:background .22s ease, transform .22s cubic-bezier(.2,.7,.3,1);
}
.tile:hover .tile__media,.tile:focus-within .tile__media{
  background:var(--amber-050); transform:scale(1.06);
}
.tile__media img{
  width:clamp(34px,5vw,48px); height:clamp(34px,5vw,48px);
  transition:transform .22s cubic-bezier(.2,.7,.3,1);
}
.tile:hover .tile__media img{ transform:scale(1.06); }
 
.tile__label{
  font-family:var(--font-display);
  font-size:clamp(13px,1.1vw,15px);
  font-weight:700; letter-spacing:-.01em;
  color:var(--green-900); line-height:1.25;
  display:inline-block; min-height:22px;
  margin-top:auto;               /* labels align even at uneven lengths */
  transition:color .18s ease;
}
.tile:hover .tile__label,.tile:focus-within .tile__label{ color:var(--amber-600); }
 
.tile a:focus-visible{ outline:3px solid var(--green-500); outline-offset:3px; border-radius:8px; }
 
@media (max-width:899px){
  .tile-strip__grid{ --cols-max:3; }
}
@media (max-width:480px){
  .tile{ padding:18px 8px 16px; gap:10px; }
}
@media (prefers-reduced-motion:reduce){
  .tile,.tile::before,.tile__media,.tile__media img{ transition:none; }
  .tile:hover{ transform:none; }
  .tile:hover .tile__media,.tile:focus-within .tile__media{ transform:none; }
}


/* ============================================================
   9. ABOUT  — collapses without a breakpoint
============================================================ */
.about__grid{
  display:grid;
  gap:clamp(32px,5vw,64px);
  grid-template-columns:repeat(auto-fit,minmax(min(340px,100%),1fr));
  align-items:center;
}
 
/* No panel behind the image: the gradient box, 4:5 ratio and contain
   padding were built for the small map PNG this slot used to hold. It
   holds a photo now, which fills the column at its own proportions. */
.about__media{
  position:relative; border-radius:var(--radius-l); overflow:hidden;
  max-width:400px; margin-inline:auto;   /* source is 724px wide — any
                                            larger and it renders soft */
}
.about__media img{ display:block; width:100%; height:auto; }
 
.about__content h2:where(:not(.h1-look)){ margin-bottom:8px; }
.about__subhead{
  color:var(--amber-500);
  font-size:clamp(1.15rem,1.05rem + .5vw,1.45rem);
  font-weight:700; margin-bottom:20px;
}
.about__content p{ margin-bottom:16px; max-width:70ch; }
.about__content p:last-child{ margin-bottom:0; }
.about__content a{ color:var(--green-500); font-weight:700; }
.about__content a:hover{ color:var(--green-700); }
.about__content a.btn--white,
.about__content a.btn--white:hover,
.about__content a.btn--white:focus-visible{ color:var(--paper-000); }
.about__content a.btn--white .icon-phone{ color:inherit; }
 
/* Justified text creates rivers on narrow screens */
.about__content p,.feature-card p,.faq-item__a-inner p{ text-align:left; }
@media (min-width:900px){
  .about__content p,.feature-card p,.faq-item__a-inner p{ text-align:justify; }
}


/* ============================================================
   10. FEATURE CARDS  — any number, accents cycle
============================================================ */
.features{ background:var(--green-050); }
.features__head{ max-width:620px; margin-bottom:var(--space-xl); }
.features__head--center{ margin-inline:auto; text-align:center; }
.features__head--center .section-kicker{ justify-content:center; }
 
.features__grid{
  --col-min:280px; --gap:var(--space-m); --cols-max:3;
  display:grid; gap:var(--gap);
  grid-template-columns:repeat(
    auto-fit,
    minmax(max(min(var(--col-min),100%),
               (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),1fr)
  );
}
 
.feature-card{
  background:var(--paper-000);
  border-radius:var(--radius-m);
  padding:clamp(24px,3vw,34px) clamp(20px,2.5vw,28px);
  border-top:4px solid var(--amber-500);
  box-shadow:var(--shadow-card);
  height:100%;
}
/* Cycles every 3 — works with 3, 4, 7 or any other count */
.feature-card:nth-child(3n+2){ border-top-color:var(--green-700); }
.feature-card:nth-child(3n+3){ border-top-color:var(--green-950); }
 
.feature-card__icon{
  width:48px; height:48px; border-radius:12px;
  background:var(--green-100); color:var(--green-800);
  display:flex; align-items:center; justify-content:center;
  margin-bottom:20px;
}
.feature-card__icon svg{ width:24px; height:24px; }
.feature-card :is(h2:where(:not(.h1-look)),h3,h4,h5,h6){
  margin-bottom:12px;
  font-size:clamp(1.05rem,1rem + .3vw,1.2rem);
  font-weight:700; line-height:1.3; color:var(--green-900);
}
.feature-card :is(h2:where(:not(.h1-look)),h3,h4,h5,h6) a{ color:inherit; }
.feature-card :is(h2:where(:not(.h1-look)),h3,h4,h5,h6) a:hover{ color:var(--amber-600); }
.feature-card p{ font-size:.97rem; }


/* ============================================================
   11. SERVICE CARDS  — any number
============================================================ */
.services{ background:var(--paper-000); }
 
.services__grid{
  --col-min:280px; --gap:clamp(20px,2.2vw,24px); --cols-max:3;
  display:grid; gap:var(--gap);
  grid-template-columns:repeat(
    auto-fit,
    minmax(max(min(var(--col-min),100%),
               (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),1fr)
  );
}
 
.service-card{
  background:var(--paper-000);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  overflow:hidden;
  display:flex; flex-direction:column;
  height:100%;
  transition:transform .22s ease, box-shadow .22s ease, border-color .22s ease;
}
.service-card:hover,.service-card:focus-within{
  transform:translateY(-6px); box-shadow:var(--shadow-pop); border-color:transparent;
}
.service-card__media{ position:relative; overflow:hidden; aspect-ratio:4/3; }
.service-card__media img{
  width:100%; height:100%; object-fit:cover; transition:transform .4s ease;
}
.service-card:hover .service-card__media img{ transform:scale(1.05); }
.service-card__body{
  padding:22px 24px 26px;
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--space-s); flex:1;
}
.service-card h4{ color:var(--green-900); }
.service-card__arrow{
  width:34px; height:34px; border-radius:50%;
  background:var(--amber-600); color:var(--paper-000);
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
  transition:background .22s ease, color .22s ease, transform .22s ease;
}
.service-card__arrow svg{ width:16px; height:16px; }
.service-card:hover .service-card__arrow{
  background:var(--green-100); color:var(--green-800); transform:translateX(4px);
}

@media (max-width:899px){
  .services__grid{ --cols-max:2; }
  .services{display: none;}
}


/* ============================================================
   12. ACCORDION / FAQ
============================================================ */
.faq{ background:var(--amber-050); }
.faq__wrap{ max-width:820px; margin-inline:auto; }
 
.faq-item{
  background:var(--paper-000);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  margin-bottom:var(--space-xs);
  overflow:hidden;
  transition:box-shadow .2s ease, border-color .2s ease;
}
.faq-item:hover{ border-color:var(--amber-400); }
.faq-item.is-open{ box-shadow:var(--shadow-card); border-color:transparent; }
 
.faq-item__q{
  width:100%; text-align:left;
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--space-s);
  padding:clamp(16px,2.2vw,22px) clamp(16px,2.2vw,24px);
  min-height:44px;
  font-family:var(--font-display); font-weight:700;
  font-size:clamp(.97rem,.93rem + .25vw,1.06rem);
  line-height:1.35;
  color:var(--green-900);
  transition:color .18s ease;
}
.faq-item__q:hover{ color:var(--amber-600); }
 
.faq-item__plus{
  width:28px; height:28px; border-radius:50%;
  background:var(--green-100);
  flex-shrink:0; position:relative;
  transition:background .25s ease, transform .25s ease;
}
.faq-item__plus::before{
  content:"";
  position:absolute; top:47%; left:50%;
  width:8px; height:8px;
  border-right:2px solid var(--green-900);
  border-bottom:2px solid var(--green-900);
  transform:translate(-50%,-65%) rotate(45deg);
  transition:border-color .25s ease;
}
.faq-item__plus::after{ content:none; }
.faq-item__q:hover .faq-item__plus{ background:var(--amber-050); }
.faq-item.is-open .faq-item__plus{
  background:var(--amber-500); transform:rotate(180deg);
}
.faq-item.is-open .faq-item__plus::before{ border-color:#fff; }
 
/* Height-agnostic reveal. Padding lives on the inner element, which
   is fully clipped while collapsed. */
.faq-item__a{
  display:grid;
  grid-template-rows:0fr;
  transition:grid-template-rows .3s ease;
}
.faq-item.is-open .faq-item__a{ grid-template-rows:1fr; }
 
.faq-item__a > *{
  overflow:hidden;
  min-height:0;
}
 
.faq-item__a-inner{
  padding:0 clamp(16px,2.2vw,24px);
  max-width:68ch;
}
.faq-item__a-inner > *:first-child{ margin-top:0; }
.faq-item.is-open .faq-item__a-inner{
  padding-bottom:clamp(18px,2.4vw,24px);
}
.faq-item__a-inner p{ font-size:.96rem; text-align:left; line-height:1.6; }
.faq-item__a-inner p + p{ margin-top:var(--space-xs); }
.faq-item__a-inner a{ color:var(--green-500); font-weight:700; text-decoration:underline; }
.faq-item__a-inner a:hover{ color:var(--green-700); }
 
@supports not (grid-template-rows:0fr){
  .faq-item__a{ max-height:0; overflow:hidden; transition:max-height .3s ease; }
  .faq-item.is-open .faq-item__a{ max-height:2000px; }
}


/* ============================================================
   13. CTA BAND
============================================================ */
.cta-band{
  position:relative; overflow:hidden;
  background:linear-gradient(100deg,var(--green-900) 0%,var(--green-800) 100%);
  color:#fff; padding-block:clamp(32px,5vw,60px);
}
.cta-band::before{
  content:""; position:absolute; inset-inline:0; top:0; height:3px;
  background:linear-gradient(90deg,var(--amber-500),var(--amber-400));
}
.cta-band__inner{
  position:relative;
  display:flex; flex-wrap:wrap;
  align-items:center; justify-content:space-between;
  gap:var(--space-m);
  text-align:center;
}
.cta-band__lead{
  font-family:var(--font-display); font-weight:800;
  font-size:clamp(1.05rem,.95rem + .7vw,1.5rem);
  line-height:1.2; letter-spacing:-.01em; color:#fff;
  flex:1 1 min(100%,420px);
  text-wrap:balance;
}
.cta-band__phone{
  font-family:var(--font-body); font-size:1rem; font-weight:700;
  padding:14px 28px; flex-shrink:0; margin-inline:auto;
}
@media (min-width:760px){
  .cta-band__inner{ text-align:left; flex-wrap:nowrap; gap:var(--space-l); }
  .cta-band__phone{ margin-inline:0; }
}
@media (max-width:600px){
  .cta-band__phone{ width:100%; }
}


/* ============================================================
   14. TABS  — generic, scrollable on mobile
   .region-tabs / .region-tab kept as aliases.
============================================================ */
.region-tabs{
  display:flex; flex-wrap:wrap; gap:9px;
}
/* On phones, don't wrap into four rows — scroll instead */
@media (max-width:640px){
  .region-tabs{
    flex-wrap:nowrap;
    overflow-x:auto;
    scroll-snap-type:x proximity;
    -webkit-overflow-scrolling:touch;
    scrollbar-width:none;
    padding-bottom:4px;
    margin-inline:calc(var(--gutter) * -1);
    padding-inline:var(--gutter);
  }
  .region-tabs::-webkit-scrollbar{ display:none; }
  .region-tab{ scroll-snap-align:start; flex:0 0 auto; }
}
 
.region-tab{
  border:1.5px solid var(--line-200); background:#fff; color:var(--green-900);
  padding:9px 16px; border-radius:999px;
  font-family:inherit; font-size:14px; font-weight:600;
  min-height:40px;
  transition:background .15s ease, border-color .15s ease, color .15s ease;
}
.region-tab:hover{ border-color:var(--amber-500); }
.region-tab.active,.region-tab[aria-selected="true"]{
  background:var(--green-900); border-color:var(--green-900); color:#fff;
}
 
.region-panel{
  margin-top:22px;
  background:var(--amber-050);
  border:1px solid var(--line-200);
  border-radius:var(--radius-s);
  padding:clamp(20px,2.6vw,28px);
  min-height:150px;
}
.region-panel[hidden]{ display:none; }
.region-panel h3{
  font-family:var(--font-body); font-size:15px; color:var(--amber-500);
  text-transform:uppercase; letter-spacing:.5px; margin-bottom:10px;
}
.region-panel p{ margin:0; color:var(--ink-700); font-size:15px; }
.region-panel p + p{ margin-top:var(--space-xs); }


/* ============================================================
   15. COVERAGE / REGIONS
============================================================ */
.coverage{ padding-block:clamp(56px,8vw,96px); }
.coverage-top{ text-align:center; max-width:640px; margin:0 auto clamp(32px,4vw,46px); }
.coverage-top h2:where(:not(.h1-look)){ font-size:clamp(26px,3.4vw,34px); }
.coverage-top p{ color:var(--ink-700); margin-top:12px; }
.coverage-top .btn{ margin-top:22px; }
 
.coverage-grid{
  display:grid;
  gap:clamp(32px,4vw,46px);
  grid-template-columns:repeat(auto-fit,minmax(min(380px,100%),1fr));
  align-items:start;
}
@media (min-width:1040px){
  .coverage-grid{ grid-template-columns:.9fr 1.1fr; }
}
 
.map-wrap{ display:flex; align-items:center; justify-content:center; }
.map-wrap svg{ width:100%; max-width:340px; height:auto; }
.region-path{ transition:fill .15s ease, stroke .15s ease; }
.region-path.covered{ fill:var(--amber-050); stroke:var(--green-900); stroke-width:1; cursor:pointer; }
.region-path.covered:hover{ fill:#F2E7D2; stroke:var(--amber-500); }
.region-path.covered.active{ fill:var(--amber-500); stroke:var(--amber-600); }
.region-path.uncovered{ fill:#EAE5D8; stroke:#CFC8B3; stroke-width:.7; }
 
@media (max-width:920px){ .map-wrap{ margin-top:28px; } }
/* The map is decorative on phones — the tabs carry the same information */
/* @media (max-width:560px){ .map-wrap{ display:none; } } */


/* ============================================================
   16. CITY / PARTNER LINK GROUPS — any number of groups or links
============================================================ */
.local{ background:var(--green-050); }

 
.local__groups{
  --col-min:280px; --gap:clamp(20px,2.2vw,24px); --cols-max:3;
  display:grid; gap:var(--gap);
  grid-template-columns:repeat(
    auto-fit,
    minmax(max(min(var(--col-min),100%),
               (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),1fr)
  );
}
 
.local-group{
  position:relative; isolation:isolate; overflow:hidden;
  background:var(--paper-000);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  box-shadow:var(--shadow-card);
  padding:clamp(24px,3vw,30px) clamp(20px,2.6vw,28px) 22px;
  height:100%;
}
.local-group::before{
  content:""; position:absolute; inset-inline:0; top:0; height:3px;
  background:linear-gradient(90deg,var(--gold-500),var(--amber-400));
}
.local-group__head{
  display:flex; align-items:center; gap:14px;
  padding-bottom:18px; margin-bottom:6px;
  border-bottom:1px solid var(--line-200);
}
.local-group__icon{
  width:44px; height:44px; border-radius:12px;
  background:var(--green-900); color:var(--gold-500);
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
}
.local-group__icon svg{ width:22px; height:22px; }
.local-group h3{
  font-family:var(--font-display); color:var(--green-900);
  font-size:1.05rem; line-height:1.25; letter-spacing:-.01em;
}
 
.local-group__chips{ display:flex; flex-direction:column; gap:0; }
 

 
.local-chip{
  position:relative; display:flex; align-items:center;
  min-height:44px; padding:11px 0 11px 16px;
  border-bottom:1px solid var(--line-100);
  font-size:.875rem; font-weight:600; line-height:1.4; color:var(--ink-700);
  transition:color .18s ease, padding-left .18s cubic-bezier(.2,.7,.3,1);
}
.local-group__chips .local-chip:last-child{ border-bottom:0; }
.local-chip::before{
  content:""; position:absolute; left:0; top:50%;
  width:3px; height:0; border-radius:999px; background:var(--amber-500);
  transform:translateY(-50%);
  transition:height .2s cubic-bezier(.2,.7,.3,1);
}
.local-chip:hover,.local-chip:focus-visible{ color:var(--green-900); padding-left:22px; }
.local-chip:hover::before,.local-chip:focus-visible::before{ height:20px; }
.local-chip:focus-visible{ outline:3px solid var(--green-500); outline-offset:2px; border-radius:6px; }
 
@media (prefers-reduced-motion:reduce){
  .local-chip,.local-chip::before{ transition:none; }
  .local-chip:hover,.local-chip:focus-visible{ padding-left:16px; }
}


/* ============================================================
   19. FOOTER  — any number of columns
============================================================ */
.site-footer{
  background:var(--green-950); color:rgba(255,255,255,.7);
  padding-block:56px 28px;
  padding-bottom:calc(28px + var(--callbar-h));   /* clears the call bar */
}
@media (min-width:769px){ .site-footer{ padding-bottom:28px; } }
 






/* justify-content is CENTER, not space-between. This row has exactly one
   child (footer.php's single <p>), and space-between parks a lone flex item
   at flex-start — which left the legal line hard against the left edge with
   ~700px of empty footer beside it at 1440px. text-align could not correct
   it: the <p> shrinks to its content width, so centring text inside a box
   that is already at the left just centres it within itself.
   If a second child is ever added here, center still reads correctly. */
.site-footer__legal{
  padding-top:24px;
  display:flex; flex-wrap:wrap; justify-content:center;
  gap:12px; font-size:.9rem; color:rgba(255,255,255,.7); text-align:center;
}
.site-footer__legal a{ color:#fff; }
@media (max-width:600px){
  .site-footer__legal{ flex-direction:column; }
}


/* ============================================================
   20. STICKY CALL BAR (mobile)
============================================================ */
.call-bar{
  position:fixed; bottom:0; left:0; width:100%; z-index:9999;
  display:none; align-items:center; justify-content:center; gap:10px;
  min-height:var(--callbar-h);
  padding:15px 0 calc(15px + env(safe-area-inset-bottom));
  background-color:var(--live-500); color:var(--paper-000);
  font-size:20px; font-weight:700; text-align:center;
  box-shadow:0 -2px 6px rgba(0,0,0,.2);
  transition:transform .25s ease;
}
.call-bar:hover{ background-color:#218838; color:var(--paper-000); }
.call-bar:active{ background-color:#000; color:var(--paper-000); }
.call-bar svg{ width:22px; height:22px; flex-shrink:0; }
@media (max-width:768px){
  .call-bar{ display:flex; }
  body{ padding-bottom:calc(var(--callbar-h) + env(safe-area-inset-bottom)); }
}

/* Slid out of view (site.js §4) while another call button — the hero
   CHIAMA, a mid-page CTA, the CTA band — is already on screen, so two
   "call us" prompts are never visible at once. body keeps its
   call-bar padding regardless: the bar still occupies its reserved
   strip, it is just translated below it, so nothing reflows when it
   toggles. */
.call-bar--hidden{ transform:translateY(100%); }


/* ============================================================
   21. UTILITIES
============================================================ */
/* ============================================================
   assets/css/prezzi.css
   Sections shared by EVERY service page (and, later, the city
   pages). Loaded by service pages only — never by the homepage,
   which uses none of it.

   Load order: global.css -> prezzi.css -> <service>.css
   so a page can still override a shared section locally.

   Tokens, .container, .btn and the header/footer/hero chrome stay
   in global.css and are never redefined here.

   Sections:
     1 pricing  ("Quanto costa un intervento ...")
     2 coverage ("Dove operiamo" — region cards + city links)

   Design is the /intervento-idraulico/ variant (left-aligned,
   1240px). The fabbro page previously carried a centred 1160px
   copy of the same section; both now render from this one
   definition.

   Deliberately NOT here: the "servizi"/"categorie" and "emergenza"
   blocks. They look shared from their class names but are genuinely
   different components on the two pages (fabbro's emergency is a
   centred text panel, idraulico's is two columns with a photo and a
   badge), so they stay page-local until a second page really does
   share the same design.
============================================================ */


/* ============================================================
   1. PRICING
============================================================ */
.svc-pricing{
  background:var(--paper-050);
  /* clamped rather than a flat 88px so it doesn't swallow a phone
     screen; identical to 88px from ~1250px up */
  padding:clamp(60px,7vw,88px) 5vw;
}
.svc-pricing-inner{ max-width:1240px; margin:0 auto; }

.svc-pricing-pill{
  display:inline-flex; align-items:center; gap:10px;
  background:var(--amber-600); color:var(--paper-000);
  font-size:13px; font-weight:700; letter-spacing:.03em;
  padding:10px 20px 10px 18px; border-radius:999px;
  margin-bottom:26px;
}
.svc-pricing-pill-bar{
  width:16px; height:2px; border-radius:2px; background:var(--paper-000);
}

.svc-pricing-title{
  margin:0 0 18px;
  font-family:var(--font-display);
  font-size:clamp(28px,3vw,38px); font-weight:800;
  color:var(--green-900); letter-spacing:-.01em;
}

.svc-pricing-intro{
  margin:0 0 8px;
  font-size:16.5px; line-height:1.65; color:var(--ink-700);
  max-width:760px;
}
.svc-pricing-intro a{
  color:var(--green-700); font-weight:700; text-decoration:underline;
}
.svc-pricing-link-full{
  display:inline-block; margin-top:4px;
  font-size:16px; font-weight:700;
  color:var(--green-900); text-decoration:underline;
}

.svc-pricing-cards{
  display:grid; grid-template-columns:repeat(3,1fr);
  gap:24px; margin:48px 0 40px;
}
.svc-pricing-card{
  background:var(--paper-000);
  border:1px solid var(--line-200); border-radius:18px;
  padding:30px 28px;
  transition:transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.svc-pricing-card:hover{
  transform:translateY(-3px);
  box-shadow:0 16px 32px rgba(14,57,94,.1);
  border-color:transparent;
}

.svc-pricing-label{
  display:flex; align-items:center; gap:8px;
  font-size:12.5px; font-weight:700; letter-spacing:.03em;
  color:var(--green-700); margin-bottom:16px;
}
.svc-pricing-label-dot{
  width:7px; height:7px; border-radius:50%;
  background:var(--amber-500); flex-shrink:0;
}
.svc-pricing-value{
  font-family:var(--font-display);
  font-size:27px; font-weight:800; line-height:1.15;
  color:var(--green-900); margin-bottom:10px;
}
.svc-pricing-note{ font-size:14.5px; line-height:1.5; color:var(--ink-700); }

.svc-pricing-terms{
  font-size:14.5px; line-height:1.7; color:var(--ink-700);
  max-width:900px; margin:0 0 40px;
}
.svc-pricing-terms strong{ color:var(--green-900); }

.svc-pricing-cta{
  display:inline-flex; align-items:center;
  background:transparent; color:var(--green-900);
  border:2px solid var(--green-900);
  font-family:var(--font-display);
  font-size:15.5px; font-weight:700; text-decoration:none;
  padding:15px 28px; border-radius:999px;
  transition:background .15s ease, color .15s ease;
}
.svc-pricing-cta:hover{ background:var(--green-900); color:var(--paper-000); }


/* ============================================================
   2. COVERAGE — "Dove operiamo"
   <details> region cards holding the city links, so the disclosure
   works with JavaScript disabled.
============================================================ */
.svc-coverage{
  background:var(--green-050);
  padding:clamp(60px,7vw,88px) 5vw;
}
.svc-coverage-inner{ max-width:1240px; margin:0 auto; }
.svc-coverage-head{ max-width:640px; margin-bottom:44px; }

.svc-coverage-eyebrow{
  display:flex; align-items:center; gap:10px; margin-bottom:20px;
}
.svc-coverage-eyebrow-bar{
  width:28px; height:3px; border-radius:2px;
  background:var(--amber-600); flex-shrink:0;
}
.svc-coverage-eyebrow-text{
  font-size:13px; font-weight:700; letter-spacing:.03em;
  color:var(--amber-600);
}
.svc-coverage-title{
  margin:0 0 14px;
  font-family:var(--font-display);
  font-size:clamp(28px,3vw,38px); font-weight:800;
  color:var(--green-900); letter-spacing:-.01em;
}
.svc-coverage-sub{
  margin:0; font-size:16px; line-height:1.6; color:var(--ink-700);
}

.svc-region-grid{
  display:grid; grid-template-columns:repeat(3,1fr); gap:18px;
}
.svc-region-card{
  background:var(--paper-000);
  border:1px solid var(--line-200); border-radius:16px;
  padding:4px 22px; height:max-content;
}
.svc-region-card summary{
  list-style:none; cursor:pointer;
  display:flex; align-items:center; gap:12px;
  padding:20px 0;
}
.svc-region-card summary::-webkit-details-marker{ display:none; }

.svc-region-pin{
  width:34px; height:34px; border-radius:10px;
  background:var(--green-100); color:var(--green-900);
  display:flex; align-items:center; justify-content:center;
  flex-shrink:0;
}
.svc-region-pin svg{ width:16px; height:16px; }

.svc-region-name-wrap{ flex:1; min-width:0; }
.svc-region-name{
  font-family:var(--font-display);
  font-size:15.5px; font-weight:700; color:var(--green-900);
}
.svc-region-count{
  display:block; font-size:12.5px; color:var(--ink-500); margin-top:2px;
}
.svc-region-plus{
  width:24px; height:24px; border-radius:50%;
  background:var(--amber-050); color:var(--amber-600);
  display:flex; align-items:center; justify-content:center;
  flex-shrink:0; font-size:17px; font-weight:700;
  transition:transform .15s ease;
}
.svc-region-card[open] .svc-region-plus{ transform:rotate(45deg); }

.svc-region-cities{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 clamp(14px,1.8vw,26px);
  list-style:none; margin:0; padding:4px 0 22px;
}
/* A row is an <li> (fabbro) or a bare <a> (the other two hubs). */
.svc-region-cities > li,
.svc-region-cities > a{
  display:flex;
  /* flex-start, not center: a long city name wraps to two lines in a card
     this narrow, and centred would float the dot into the middle of them */
  align-items:flex-start; gap:9px;
  min-width:0;
  padding:8px 2px;
  border-bottom:1px solid var(--line-200);
}
.svc-region-cities > li::before,
.svc-region-cities > a::before{
  content:""; flex-shrink:0;
  width:5px; height:5px; border-radius:50%;
  background:var(--amber-500);
  /* nudged down to sit on the first line's centre rather than the row's */
  margin-top:7px;
}
.svc-region-cities a{
  min-width:0;
  font-size:13.5px; font-weight:600; line-height:1.45;
  color:var(--green-700); text-decoration:none;
  transition:color .15s ease;
}
.svc-region-cities a:hover{ color:var(--green-900); }
.svc-region-cities > li > a{ flex:1 1 auto; }

/* Optional CTA under the region grid (fabbro uses it). */
.svc-coverage-cta{ text-align:center; margin-top:40px; }


/* ============================================================
   RESPONSIVE
============================================================ */
@media (max-width:980px){
  .svc-region-grid{ grid-template-columns:repeat(2,1fr); }
}
@media (max-width:900px){
  .svc-pricing-cards{ grid-template-columns:1fr; }
}
@media (max-width:620px){
  .svc-region-grid{ grid-template-columns:1fr; }
}
@media (max-width:480px){
  .svc-pricing-card{ padding:24px 22px; }
  .svc-region-card{ padding:2px 18px; }
  .svc-pricing-cta{ justify-content:center; }
}


/* ============================================================
   3. /prezzi/ — TARIFFE
   ------------------------------------------------------------
   PAGE-SCOPED. Every selector below is prefixed .pz- and no .pz-
   class appears in the markup of any other page, so the 396
   service pages that load this file render exactly as before —
   they only carry the extra bytes.

   The price tables stay real <table>s. On phones each row folds
   into a card and every cell labels itself from the data-label
   attribute the source markup already carries, so nothing is
   duplicated in the HTML to get the card view. The <thead> is
   not hidden on mobile: it becomes a compact legend, which is
   the only place the time ranges ("Lun–Ven, 8:00–17:00") are
   written, and they would otherwise be lost.
============================================================ */

/* ---------- shared shell ---------- */
.pz-inner{ max-width:1240px; margin:0 auto; }
.pz-inner--narrow{ max-width:900px; }

.pz-section{ padding:clamp(60px,7vw,88px) 5vw; }
.pz-section--alt{ background:var(--paper-050); }
.pz-section--tint{ background:var(--green-050); }

.pz-head{ max-width:70ch; margin:0 0 clamp(28px,3.5vw,44px); }
.pz-head h2:where(:not(.h1-look)){
  margin:0 0 14px;
  color:var(--green-900);
  font-size:clamp(1.5rem,1.25rem + 1.2vw,2.15rem);
  line-height:1.14;
  letter-spacing:-.02em;
}
.pz-lead{
  margin:0;
  max-width:62ch;
  font-size:1.02rem;
  line-height:1.7;
  color:var(--ink-500);
}
.pz-note{
  margin:clamp(22px,3vw,32px) 0 0;
  padding:16px 20px;
  border-left:3px solid var(--amber-500);
  background:var(--amber-050);
  border-radius:0 var(--radius-s) var(--radius-s) 0;
  font-size:.95rem;
  line-height:1.65;
  color:var(--ink-700);
}
.pz-note strong{ color:var(--green-900); }


/* ============================================================
   3.1 HERO
============================================================ */
.pz-hero{
  position:relative;
  overflow:hidden;
  background:var(--green-050);
  padding:clamp(40px,6vw,76px) 5vw clamp(44px,6vw,80px);
}
.pz-hero__shape{
  position:absolute;
  top:-48%; right:-10%;
  width:min(60vw,680px); aspect-ratio:1;
  border-radius:50%;
  background:radial-gradient(circle at 35% 35%,
              rgba(41,145,214,.16) 0%,
              rgba(255,81,0,.08) 45%,
              transparent 70%);
  pointer-events:none;
  z-index:0;
}
.pz-hero__inner{ position:relative; z-index:1; max-width:1240px; margin:0 auto; }

.pz-hero h1,
.pz-hero h2:where(.h1-look){
  margin:0 0 18px;
  max-width:18ch;
  color:var(--green-900);
  font-size:clamp(1.95rem,1.4rem + 2.4vw,3.1rem);
  line-height:1.05;
  letter-spacing:-.025em;
}
.pz-hero__lead{
  margin:0 0 clamp(24px,3vw,32px);
  max-width:60ch;
  font-size:clamp(1rem,.97rem + .2vw,1.1rem);
  line-height:1.7;
  color:var(--ink-700);
}

.pz-points{
  display:flex;
  flex-wrap:wrap;
  gap:10px 12px;
  margin:0 0 clamp(26px,3.4vw,36px);
  padding:0;
}
.pz-point{
  display:inline-flex;
  align-items:center;
  gap:9px;
  padding:9px 16px 9px 13px;
  border:1px solid var(--line-200);
  border-radius:999px;
  background:var(--paper-000);
  font-size:.9rem;
  font-weight:600;
  line-height:1.3;
  color:var(--green-900);
}
.pz-point::before{
  content:"";
  flex-shrink:0;
  width:16px; height:16px;
  border-radius:50%;
  background:var(--green-700);
  /* white tick, drawn rather than shipped as an asset */
  -webkit-mask:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center/13px no-repeat,
        linear-gradient(#000,#000);
  -webkit-mask-composite:xor;
  mask:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center/13px no-repeat,
        linear-gradient(#000,#000);
  mask-composite:exclude;
}


/* ============================================================
   3.2 SERVICE TABS + PRICE TABLES
   ------------------------------------------------------------
   One table visible at a time, switched by clicking a service
   name — the behaviour the export has, rebuilt without JS.

   Three same-name radios sit before the panels; each :checked
   radio reveals its sibling panel and lights its own label.
   site.js is untouched. The radios are moved off-screen rather
   than display:none so they stay keyboard-reachable: arrow keys
   move between services, exactly like a real tab strip.

   The labels are NOT headings — the export carries these three
   words as <button>s and the page's heading hierarchy is
   reproduced exactly (hard rule 9).

   A link such as /prezzi/#fabbro picks the tab: site.js §5 ticks
   the matching radio and scrolls this heading into view.
============================================================ */
.pz-tabs{ position:relative; }
/* Where site.js scrolls to when a link names a service: keep the
   heading clear of the sticky header. */
.pz-section .pz-head{ scroll-margin-top:calc(var(--header-h) + var(--space-s)); }

.pz-tabs__input{
  position:absolute;
  width:1px; height:1px;
  margin:0;
  opacity:0;
  pointer-events:none;
}

.pz-tabs__list{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin:0 0 20px;
  padding:0;
}

.pz-tab{
  display:inline-flex;
  align-items:center;
  gap:10px;
  min-height:44px;                 /* tap target */
  padding:11px 22px;
  border:1px solid var(--line-200);
  border-radius:999px;
  background:var(--paper-000);
  cursor:pointer;
  font-family:var(--font-display);
  font-weight:700;
  font-size:clamp(.95rem,.92rem + .2vw,1.05rem);
  line-height:1.2;
  color:var(--ink-700);
  user-select:none;
  transition:background .18s ease, border-color .18s ease, color .18s ease;
}
.pz-tab::before{
  content:"";
  width:8px; height:8px;
  border-radius:50%;
  background:var(--line-200);
  flex-shrink:0;
  transition:background .18s ease, transform .18s ease;
}
.pz-tab:hover{ border-color:var(--amber-400); color:var(--green-900); }

/* Panels are hidden until their radio is checked. */
.pz-panel{ display:none; }

/* --- Elettricista --- */
#pz-r-elettricista:checked ~ .pz-tabs__list .pz-tab[for="pz-r-elettricista"],
#pz-r-idraulico:checked    ~ .pz-tabs__list .pz-tab[for="pz-r-idraulico"],
#pz-r-fabbro:checked       ~ .pz-tabs__list .pz-tab[for="pz-r-fabbro"]{
  background:var(--green-900);
  border-color:var(--green-900);
  color:var(--paper-000);
}
#pz-r-elettricista:checked ~ .pz-tabs__list .pz-tab[for="pz-r-elettricista"]::before,
#pz-r-idraulico:checked    ~ .pz-tabs__list .pz-tab[for="pz-r-idraulico"]::before,
#pz-r-fabbro:checked       ~ .pz-tabs__list .pz-tab[for="pz-r-fabbro"]::before{
  background:var(--amber-500);
  transform:scale(1.15);
}

#pz-r-elettricista:checked ~ #pz-p-elettricista,
#pz-r-idraulico:checked    ~ #pz-p-idraulico,
#pz-r-fabbro:checked       ~ #pz-p-fabbro{ display:block; }

/* Keyboard focus has to show on the label, since the radio itself
   is off-screen. */
#pz-r-elettricista:focus-visible ~ .pz-tabs__list .pz-tab[for="pz-r-elettricista"],
#pz-r-idraulico:focus-visible    ~ .pz-tabs__list .pz-tab[for="pz-r-idraulico"],
#pz-r-fabbro:focus-visible       ~ .pz-tabs__list .pz-tab[for="pz-r-fabbro"]{
  outline:3px solid var(--green-500);
  outline-offset:3px;
}

/* Printing a tabbed page would lose two services out of three. */
@media print{
  .pz-panel{ display:block !important; }
  .pz-tabs__list{ display:none; }
}

.pz-table-wrap{
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  background:var(--paper-000);
  box-shadow:var(--shadow-card);
  overflow:hidden;
}

.pz-table{
  width:100%;
  border-collapse:collapse;
  font-size:.93rem;
}

.pz-table thead th{
  padding:14px 18px;
  text-align:left;
  vertical-align:bottom;
  background:var(--green-900);
  color:var(--paper-000);
  font-family:var(--font-display);
  font-weight:700;
  font-size:.78rem;
  letter-spacing:.05em;
  text-transform:uppercase;
  line-height:1.25;
}
.pz-table thead th span{
  display:block;
  margin-top:5px;
  font-family:var(--font-body);
  font-weight:500;
  font-size:.72rem;
  letter-spacing:.01em;
  text-transform:none;
  color:rgba(255,255,255,.66);
  white-space:nowrap;
}

.pz-table tbody th{
  padding:14px 18px;
  text-align:left;
  vertical-align:middle;
  font-weight:650;
  line-height:1.45;
  color:var(--green-900);
  border-top:1px solid var(--line-100);
}
.pz-table tbody td{
  padding:14px 18px;
  text-align:left;
  vertical-align:middle;
  white-space:nowrap;
  font-variant-numeric:tabular-nums;
  font-weight:600;
  color:var(--ink-700);
  border-top:1px solid var(--line-100);
}
.pz-table tbody tr:nth-child(even) th,
.pz-table tbody tr:nth-child(even) td{ background:var(--green-050); }

/* Out-of-hours columns carry the premium — mark them, don't explain
   them in words the source does not have. */
.pz-table tbody td:nth-child(4),
.pz-table tbody td:nth-child(5){ color:var(--amber-600); }


/* ---------- phones: each row becomes a card ---------- */
@media (max-width:860px){
  .pz-table-wrap{ border:0; border-radius:0; background:none; box-shadow:none; overflow:visible; }
  .pz-table,
  .pz-table tbody,
  .pz-table tr,
  .pz-table tbody th,
  .pz-table tbody td{ display:block; width:100%; }

  /* The header row is the only place the time ranges are written,
     so it stays — reflowed as a legend above the cards. */
  .pz-table thead{ display:block; }
  .pz-table thead tr{
    display:grid;
    gap:8px;
    padding:16px 18px;
    border-radius:var(--radius-m);
    background:var(--green-900);
  }
  .pz-table thead th{
    padding:0;
    background:none;
    border:0;
    font-size:.74rem;
  }
  .pz-table thead th:first-child{
    padding-bottom:8px;
    border-bottom:1px solid rgba(255,255,255,.18);
  }
  .pz-table thead th span{ display:inline; margin:0 0 0 6px; }

  .pz-table tbody tr{
    margin-top:14px;
    border:1px solid var(--line-200);
    border-radius:var(--radius-m);
    background:var(--paper-000);
    box-shadow:var(--shadow-card);
    overflow:hidden;
  }
  .pz-table tbody tr:nth-child(even) th,
  .pz-table tbody tr:nth-child(even) td{ background:none; }

  .pz-table tbody th{
    padding:14px 16px;
    border-top:0;
    border-bottom:1px solid var(--line-200);
    background:var(--green-050);
    font-size:.97rem;
  }
  .pz-table tbody td{
    display:flex;
    align-items:baseline;
    justify-content:space-between;
    gap:16px;
    padding:11px 16px;
    border-top:0;
  }
  .pz-table tbody td + td{ border-top:1px solid var(--line-100); }

  /* The label comes from the attribute already in the markup. */
  .pz-table tbody td::before{
    content:attr(data-label);
    font-weight:600;
    font-size:.86rem;
    letter-spacing:.01em;
    color:var(--ink-500);
    text-transform:none;
    white-space:normal;
  }
}


/* ============================================================
   3.3 INCLUDED / NOT INCLUDED
============================================================ */
.pz-split{
  display:grid;
  gap:var(--space-m);
  grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));
}

.pz-card{
  padding:clamp(24px,3vw,34px) clamp(20px,2.5vw,30px);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  background:var(--paper-000);
  box-shadow:var(--shadow-card);
}
.pz-card h3{
  margin:0 0 16px;
  font-size:clamp(1.02rem,.98rem + .3vw,1.18rem);
  font-weight:700;
  line-height:1.3;
  color:var(--green-900);
}
.pz-card p{
  margin:0;
  font-size:.97rem;
  line-height:1.7;
  color:var(--ink-700);
}

.pz-card--yes{ border-top:4px solid var(--green-700); }
.pz-card--no{ border-top:4px solid var(--amber-500); }

.pz-list{
  display:grid;
  gap:11px;
  margin:0;
  padding:0;
  font-size:.97rem;
  line-height:1.6;
  color:var(--ink-700);
}
.pz-list li{ position:relative; padding-left:28px; }
.pz-list li::before{
  content:"";
  position:absolute;
  left:0; top:.34em;
  width:16px; height:16px;
  border-radius:50%;
  flex-shrink:0;
}
.pz-card--yes .pz-list li::before{
  background:var(--green-100);
  box-shadow:inset 0 0 0 1px var(--green-500);
}
.pz-card--no .pz-list li::before{
  background:var(--amber-050);
  box-shadow:inset 0 0 0 1px var(--amber-400);
}


/* ============================================================
   3.4 FACTORS
============================================================ */
.pz-grid{
  --col-min:260px; --gap:var(--space-m); --cols-max:3;
  display:grid; gap:var(--gap);
  grid-template-columns:repeat(
    auto-fit,
    minmax(max(min(var(--col-min),100%),
               (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),1fr)
  );
}

.pz-factor{
  padding:clamp(22px,2.6vw,28px) clamp(20px,2.4vw,26px);
  border:1px solid var(--line-200);
  border-left:3px solid var(--green-700);
  border-radius:var(--radius-s);
  background:var(--paper-000);
}
.pz-factor h3{
  margin:0 0 10px;
  font-size:1.02rem;
  font-weight:700;
  line-height:1.3;
  color:var(--green-900);
}
.pz-factor p{
  margin:0;
  font-size:.94rem;
  line-height:1.65;
  color:var(--ink-700);
}


/* ============================================================
   3.5 STEPS
============================================================ */
.pz-steps{
  --col-min:240px; --gap:var(--space-m); --cols-max:4;
  display:grid; gap:var(--gap);
  grid-template-columns:repeat(
    auto-fit,
    minmax(max(min(var(--col-min),100%),
               (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),1fr)
  );
  margin:0; padding:0;
}

.pz-step{
  position:relative;
  padding:clamp(24px,3vw,30px) clamp(20px,2.4vw,26px);
  border-radius:var(--radius-m);
  background:var(--paper-000);
  box-shadow:var(--shadow-card);
}
.pz-step__num{
  display:grid;
  place-items:center;
  width:40px; height:40px;
  margin-bottom:16px;
  border-radius:50%;
  background:var(--green-900);
  color:var(--paper-000);
  font-family:var(--font-display);
  font-weight:800;
  font-size:1rem;
  line-height:1;
}
.pz-step h3{
  margin:0 0 10px;
  font-size:1.02rem;
  font-weight:700;
  line-height:1.3;
  color:var(--green-900);
}
.pz-step p{
  margin:0;
  font-size:.94rem;
  line-height:1.65;
  color:var(--ink-700);
}


/* ============================================================
   3.6 CLOSING CTA COPY
   .cta-band itself is global.css; this only lets the band hold a
   heading plus a line of copy instead of a single lead.
============================================================ */
.pz-cta-copy{ flex:1 1 min(100%,520px); }
.pz-cta-copy h2:where(:not(.h1-look)){
  margin:0 0 8px;
  color:#fff;
  font-size:clamp(1.25rem,1.05rem + .9vw,1.75rem);
  line-height:1.15;
  letter-spacing:-.015em;
}
.pz-cta-copy p{
  margin:0;
  font-size:.98rem;
  line-height:1.6;
  color:rgba(255,255,255,.78);
}
/* ============================================================
   assets/css/elettricista.css
   /intervento-elettricista/ — page-specific sections only.

   Load order: global.css -> prezzi.css -> elettricista.css
   ($page_css = array("prezzi", "elettricista"))

   The page is assembled out of shared components. This file adds
   only the four things neither shared file has, plus two slot
   fillers for content global.css's components don't style.

   Comes from global.css, never redefined here:
     tokens, reset, typography, .container, .btn/.btn--primary/
     .btn--outline, .icon-phone, header + mobile nav, footer,
     .call-bar, .hero--split (the whole hero), .features/
     .features__head/.features__grid/.feature-card (intro tiles),
     .tile-strip/.tile (icon tiles), .faq/.faq__wrap/.faq-item/
     .faq-item__q/.faq-item__plus/.faq-item__a (FAQ accordion),
     .services background, .section-kicker

   Comes from prezzi.css, never redefined here:
     .svc-coverage / .svc-region-* ("Dove operiamo")

   Sections below: slot fillers · section headings · service chips ·
                   FAQ answer list · closing panel · emergency panel
============================================================ */


/* ============================================================
   SLOT FILLERS — content global.css's components don't cover
============================================================ */

/* global.css styles headings inside .feature-card, but the intro
   tiles are deliberately <p>: the old page has no heading there and
   the hierarchy must match it exactly (hard rule 9). */
.feature-card__title {
  margin: 0 0 12px;
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1rem + 0.3vw, 1.2rem);
  font-weight: 700;
  line-height: 1.3;
  color: var(--green-900);
}

/* Bulleted lists inside a FAQ answer. global.css styles the answer's
   paragraphs and links but has no list treatment. */
.faq-item__a-inner .faq-list {
  margin: 0 0 var(--space-s);
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}

.faq-item__a-inner .faq-list li {
  display: flex;
  gap: var(--space-2xs);
  font-size: 0.96rem;
  line-height: 1.6;
  color: var(--ink-700);
}

.faq-item__a-inner .faq-list li::before {
  content: "\2013";
  color: var(--amber-500);
  font-weight: 700;
  flex-shrink: 0;
}

.faq-item__a-inner strong { color: var(--green-900); }


/* ============================================================
   SECTION HEADINGS
   The page's sections lead with a green heading rather than
   global.css's default --ink-900 one.
============================================================ */
.section-title {
  margin: 0 0 var(--space-s);
  font-size: clamp(1.75rem, 1.5rem + 1vw, 2.375rem);
  font-weight: 800;
  color: var(--green-900);
  letter-spacing: -0.01em;
}

.section-title--center { text-align: center; }

.section-text {
  margin: 0 0 var(--space-l);
  font-size: 1.03rem;
  line-height: 1.7;
  color: var(--ink-700);
  max-width: 68ch;
}


/* ============================================================
   SERVICE CHIPS — the scannable list under "Pronto Intervento
   Elettricista 24H". No shared component has this; global's
   .service-card is an image card, not a chip.
   Fluid grid, so the number of chips never needs new CSS.
============================================================ */
.service-grid {
  --col-min: 260px;
  --gap: var(--space-xs);
  --cols-max: 3;
  display: grid;
  gap: var(--gap);
  grid-template-columns: repeat(
    auto-fit,
    minmax(
      max(min(var(--col-min), 100%),
          (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),
      1fr
    )
  );
  margin-bottom: var(--space-l);
}

.service-chip {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  background: var(--green-100);
  border-radius: var(--radius-s);
  padding: var(--space-s) 18px;
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--green-900);
}

.service-chip-icon {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--amber-600);
  color: var(--paper-000);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

.service-chip-icon svg { width: 11px; height: 11px; }

.services-closing {
  background: var(--amber-050);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  padding: 28px 30px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-m);
}

.services-closing p {
  margin: 0;
  font-size: 0.97rem;
  line-height: 1.6;
  color: var(--ink-700);
  max-width: 60ch;
}

/* Targets global.css's .btn — keeps it from being squashed by the
   flex row, at the slightly smaller size this panel wants. */
.services-closing .btn {
  flex-shrink: 0;
  padding: 15px 26px;
  font-size: 0.95rem;
}


/* ============================================================
   CLOSING PANEL — dark centred band.
   Not global.css's .cta-band: that one is a single lead line plus a
   button, with nowhere to put this section's paragraph, and copy is
   never dropped to fit a layout (hard rule 7).
============================================================ */
.closing {
  background: var(--green-900);
  padding-block: clamp(56px, 7vw, 72px);
}

.closing-inner {
  width: min(100% - (var(--gutter) * 2), 760px);
  margin-inline: auto;
  text-align: center;
}

.closing h2:where(:not(.h1-look)),
.closing h1:where(.h2-look) {
  margin: 0 0 var(--space-s);
  font-size: clamp(1.625rem, 1.4rem + 1vw, 2.125rem);
  font-weight: 800;
  color: var(--paper-000);
  letter-spacing: -0.01em;
}

.closing p {
  margin: 0 0 var(--space-l);
  font-size: 1.03rem;
  line-height: 1.7;
  color: var(--green-100);
}

/* .btn is nowrap; "Chiama Subito Pronto Intervento Elettricista 24"
   is wider than a 360px phone, so let it wrap inside the band. */
@media (max-width: 480px) {
  .closing .btn { white-space: normal; max-width: 100%; line-height: 1.3; }
}


/* ============================================================
   EMERGENCY PANEL — dark two-column band with photo + badge.
   global.css's .about__grid is the nearest thing and has neither
   the dark treatment nor the overlapping badge.
============================================================ */
.emergency {
  background: var(--green-950);
  padding-block: clamp(64px, 8vw, 92px);
}

.emergency-inner {
  width: min(100% - (var(--gutter) * 2), var(--max-w));
  margin-inline: auto;
  display: grid;
  gap: clamp(48px, 5vw, 64px);
  grid-template-columns: minmax(0, 1fr);
  align-items: center;
}

@media (min-width: 900px) {
  .emergency-inner { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
}

.emergency-eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  margin-bottom: 22px;
}

.emergency-eyebrow-bar {
  width: 28px;
  height: 3px;
  background: var(--amber-500);
  border-radius: 2px;
  flex-shrink: 0;
}

.emergency-eyebrow-text {
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--amber-500);
}

.emergency-title {
  margin: 0 0 var(--space-m);
  font-size: clamp(1.75rem, 1.5rem + 1.2vw, 2.5rem);
  font-weight: 800;
  color: var(--paper-000);
  letter-spacing: -0.01em;
  line-height: 1.15;
}

.emergency-text {
  font-size: 1.03rem;
  line-height: 1.75;
  color: var(--green-100);
  margin: 0 0 var(--space-m);
  max-width: 62ch;
}

.emergency-text a {
  color: var(--amber-400);
  font-weight: 700;
  text-decoration: underline;
}

.emergency-cta { margin-top: var(--space-xs); }

.emergency-media { position: relative; }

@media (max-width: 899px) {
  .emergency-media { max-width: 420px; margin-inline: auto; }
}

.emergency-frame {
  position: relative;
  border-radius: var(--radius-l);
  overflow: hidden;
  aspect-ratio: 6 / 4.4;
  box-shadow: var(--shadow-pop);
}

.emergency-frame img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.emergency-badge {
  position: absolute;
  bottom: -22px;
  left: -22px;
  background: var(--amber-600);
  color: var(--paper-000);
  border-radius: var(--radius-m);
  padding: var(--space-s) 22px;
  box-shadow: var(--shadow-pop);
}

.emergency-badge-value {
  font-family: var(--font-display);
  font-size: 1.25rem;
  font-weight: 800;
  line-height: 1.1;
}

.emergency-badge-label {
  font-size: 0.78rem;
  margin-top: 3px;
  opacity: 0.92;
}

@media (max-width: 480px) {
  .emergency-badge { padding: 12px 16px; left: -10px; bottom: -16px; }
}


/* ============================================================
   ============================================================
   CITY PAGE — /intervento-elettricista/elettricista-milano/
   ============================================================

   Everything below belongs to the city page only. Nothing above
   is touched, so /intervento-elettricista/ renders unchanged.

   All selectors are .city-* (or .closing h3, which the parent
   page has no h3 inside .closing to match), so the two pages
   sharing this file cannot collide.

   Reused, never redefined here:
     global.css  .btn/.btn--primary/.btn--white, .icon-phone,
                 .container, .tile-strip/.tile, .call-bar,
                 .section-kicker
     prezzi.css  .svc-pricing*
     this file   .section-title, .section-text, .closing
============================================================ */


/* ------------------------------------------------------------
   HERO — global.css's .hero--split, used verbatim exactly as
   /intervento-elettricista/ does. Do not re-implement it here.

   The one exception: this page's H1 is "PRONTO INTERVENTO
   ELETTRICISTA MILANO?" — all caps and half again as long as the
   parent page's, so global.css's hero H1 clamp sets it too large
   and the line breaks three ways. .hero--city steps it down until
   it breaks two ways at every width.

   The clamp is sized off the longest of the two lines,
   "ELETTRICISTA MILANO?" (~13.2em in Archivo 900 uppercase),
   against the narrowest the copy column ever gets. That column is
   narrowest just after the hero goes two-up at 980px (~425px), not
   on a phone. So the vw term stays gentle to clear that band, and
   the growth it gives up there is put back as a higher ceiling for
   the wide screens that have room to spare:

     400px  -> 24.8px, line ~327px in a ~360px column
     980px  -> 30.4px, line ~401px in a ~425px column
     1200px -> 33.8px, line ~446px in a ~518px column
     1440px -> 37.6px, line ~496px in a ~600px column

   text-wrap:balance (inherited from global.css's h1 rule) then
   splits it "PRONTO INTERVENTO / ELETTRICISTA MILANO?".

   The modifier exists so the override cannot reach the parent
   page, which shares this stylesheet. Specificity (0,3,1) beats
   global.css's .hero.hero--split h1 (0,2,1) whatever the load
   order, so this does NOT depend on file order.
   global.css itself is untouched.
------------------------------------------------------------ */
/* Step-down override removed (owner request): the city H1 now takes
   global.css's hero size like every other service page, so it may
   wrap onto three lines. Nothing to override here. */

/* Trust list two-up on a phone. global.css builds it with
   auto-fit and a 200px minimum, which needs ~424px of room for a
   second column — so below that it collapses to one item per row
   and the four items cost four full rows above the fold, on the
   screen where fold space is worth most.

   Forcing exactly two columns leaves ~149px of text per cell at
   400px, so the type, the tick and both gaps come down to keep
   "Preventivo Trasparente", the longest of the four, on one line.

   Scoped to .hero--city, like the H1 rule above, so the parent
   page's hero is untouched. Each selector carries one class more
   than the global.css rule it overrides, so load order is
   irrelevant. */
@media (max-width: 560px) {
  .hero--city .hero__trust {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 10px 12px;
  }

  .hero--city .hero__trust li { font-size: 0.82rem; gap: 8px; }

  .hero--city .hero__trust svg { width: 17px; height: 17px; }
}

/* Trust items that are headings on the old page (riparazione-
   elettrici-milano: five "»" <h4>s). The <h4> takes the <li>'s look
   rather than the heading type scale; its "»" is the marker, so no
   check icon. */
.hero__trust li h4 {
  margin: 0;
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
}

/* Trust points that are whole phrases, not two-word badges
   (impianti-allarme-e-antifurto-milano): one column at every width,
   the check icon aligned to the first line of text. Beats the 2-up
   phone rule for .hero--city above by specificity. */
.hero--city .hero__trust.hero__trust--list {
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-2xs);
}

.hero__trust--list li { align-items: flex-start; }

.hero__trust--list li svg { margin-top: 0.1em; }


/* ------------------------------------------------------------
   ICON STRIP — two of the six tile labels are links on the old
   page. global.css styles .tile__label but not an <a> inside it.
------------------------------------------------------------ */
.tile-strip .tile__label a {
  color: inherit;
  text-decoration: none;
}

.tile-strip .tile__label a:hover,
.tile-strip .tile__label a:focus-visible {
  color: var(--amber-600);
  text-decoration: underline;
}


/* ------------------------------------------------------------
   PROSE BANDS — the body-copy sections. One measured column so
   long Italian paragraphs stay readable on a wide screen, and
   left-aligned rather than the old page's justified text (which
   rivers badly at phone width).
------------------------------------------------------------ */
.city-prose { background: var(--paper-000); }

/* Full width by default. .city-prose--split re-caps its own copy
   column further down for the two-column layout most city pages
   use; the base (single-column) case — elettricista-aprilia and
   elettricista-tivoli's icon+prose band — spans the container. */
.city-prose__col { max-width: none; }

/* elettricista-roma/elettricista-tivoli's prose icon: a soft round
   badge floated into the paragraph so the text wraps around it
   instead of the icon sitting in its own block above the copy. */
.city-prose__icon {
  float: left;
  shape-outside: circle(50%);
  margin: 2px 20px 12px 0;
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--green-100);
  display: flex;
  align-items: center;
  justify-content: center;
}

.city-prose__col p {
  margin: 0 0 var(--space-s);
  font-size: 1.03rem;
  line-height: 1.75;
  color: var(--ink-700);
  text-align: left;
}

.city-prose__col p:last-child { margin-bottom: 0; }

.city-prose__col strong { color: var(--green-900); }

.city-prose__col a {
  color: var(--green-500);
  font-weight: 700;
  text-decoration: underline;
}

.city-prose__col a:hover { color: var(--green-700); }

/* A .btn ending the copy column (elettricista-brescia). The
   descendant rules above colour and underline every <a> in the
   column, which would strip a button of its own styling — so the
   button opts back out. */
.city-prose__col a.btn { text-decoration: none; }

.city-prose__col a.btn--primary,
.city-prose__col a.btn--primary:hover { color: var(--paper-000); }

.city-prose__cta { margin-top: var(--space-s); }

/* elettricista-udine: several sub-headings (H3s, one H4) sit inside
   prose copy between paragraphs — both in .city-prose__col and in
   .city-prose__media used as a text/list sidebar rather than a
   photo column. No other city page nests a heading inside its
   copy, so global.css's headings carry no margin of their own (the
   universal reset zeroes it); without this, the paragraph right
   after one of these would sit flush against the heading text. */
.city-prose h3,
.city-prose h4 {
  margin: 0 0 var(--space-s);
}

@media (max-width: 560px) {
  .city-prose__cta { width: 100%; justify-content: center; }
}

/* ------------------------------------------------------------
   3 MOTIVI — centred intro, three numbered cards, a closing call
   strip, then the subhead panel with the keyword chips.
   Replaces the old .city-prose--tint treatment of this section.
------------------------------------------------------------ */
.city-why { background: var(--green-050); }

/* Left-aligned, flush with the cards below it — not centred.
   Centred type sets a ragged left edge, which is the edge the eye
   returns to on every line of a paragraph this long.

   Full container width. var(--max-w) IS 1240px — the token rather
   than the literal, per the CSS rules — and since .container is
   already capped at the same value, this makes the head span the
   full width of the card row beneath it. */
.city-why__head {
  max-width: var(--max-w);
  margin: 0 0 var(--space-xl);
  text-align: left;
}

.city-why__title {
  margin: 0 0 var(--space-s);
  font-size: clamp(1.6rem, 1.35rem + 1.1vw, 2.375rem);
  font-weight: 800;
  color: var(--green-900);
  letter-spacing: -0.01em;
}

.city-why__intro {
  margin: 0;
  font-size: 1.03rem;
  line-height: 1.75;
  color: var(--ink-700);
}

.city-why__intro strong { color: var(--green-900); }

/* Fluid — a fourth reason would need no new CSS. */
.city-why__grid {
  --col-min: 280px;
  --gap: clamp(20px, 2.4vw, 28px);
  --cols-max: 3;
  display: grid;
  gap: var(--gap);
  grid-template-columns: repeat(
    auto-fit,
    minmax(
      max(min(var(--col-min), 100%),
          (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),
      1fr
    )
  );
  margin-bottom: var(--space-l);
}

.city-reason {
  position: relative;
  overflow: hidden;
  background: var(--paper-000);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  padding: clamp(24px, 3vw, 34px);
  box-shadow: var(--shadow-card);
  transition: transform .22s cubic-bezier(.2,.7,.3,1),
              box-shadow .22s cubic-bezier(.2,.7,.3,1),
              border-color .22s ease;
}

.city-reason::before {
  content: "";
  position: absolute;
  inset-inline: 0;
  top: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--amber-500), var(--amber-400));
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .28s cubic-bezier(.2,.7,.3,1);
}

.city-reason:hover,
.city-reason:focus-within {
  transform: translateY(-4px);
  border-color: transparent;
  box-shadow: var(--shadow-pop);
}

.city-reason:hover::before,
.city-reason:focus-within::before { transform: scaleX(1); }

/* The "1." / "2." / "3." lifted out of the paragraph text. */
.city-reason__num {
  display: block;
  margin-bottom: var(--space-xs);
  font-family: var(--font-display);
  font-size: clamp(2rem, 1.6rem + 1.6vw, 2.75rem);
  font-weight: 800;
  line-height: 1;
  color: var(--amber-500);
  letter-spacing: -0.03em;
}

.city-reason p {
  margin: 0;
  font-size: 0.98rem;
  line-height: 1.7;
  color: var(--ink-700);
}

.city-reason p strong { color: var(--green-900); }

/* Closing line — the one paragraph here that carries the number,
   so it reads as a call strip rather than more body copy. */
.city-why__close {
  margin: 0 0 var(--space-xl);
  padding: var(--space-m) clamp(20px, 3vw, 32px);
  background: var(--amber-050);
  border-left: 4px solid var(--amber-500);
  border-radius: 0 var(--radius-m) var(--radius-m) 0;
  font-size: 1.01rem;
  line-height: 1.7;
  color: var(--ink-700);
}

.city-why__close strong { color: var(--green-900); }

.city-why__close a {
  color: var(--amber-600);
  font-weight: 700;
  text-decoration: underline;
  white-space: nowrap;
}

.city-why__close a:hover { color: var(--amber-500); }

/* Subhead + keyword chips */
.city-why__panel {
  background: var(--paper-000);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  box-shadow: var(--shadow-card);
  padding: clamp(24px, 4vw, 44px);
}

.city-why__subhead {
  margin: 0 0 var(--space-s);
  font-size: clamp(1.2rem, 1.05rem + 0.75vw, 1.6rem);
  font-weight: 800;
  color: var(--green-900);
  line-height: 1.25;
}

.city-why__lead {
  margin: 0 0 var(--space-m);
  font-size: 1.01rem;
  line-height: 1.7;
  color: var(--ink-700);
  max-width: 72ch;
}

/* The 16 terms that were one pipe-separated line.

   A column ladder, not a flowing cloud: 2 up on a phone, 5 on a
   wide screen, matching .city-area__cities so the two list blocks
   on this page behave the same way.

   Because a chip is now as wide as its column rather than as wide
   as its text, the long terms wrap at every size — so the shape is
   a --radius-s rectangle rather than a 999px pill (a pill with two
   lines in it reads as a mistake), and the dot sits on the first
   line instead of at the vertical centre of a box it no longer
   matches. */
.city-why__chips {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-2xs);
}

@media (min-width: 760px)  { .city-why__chips { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1000px) { .city-why__chips { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1240px) { .city-why__chips { grid-template-columns: repeat(5, minmax(0, 1fr)); } }

.city-why__chips li {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2xs);
  padding: 10px 14px;
  background: var(--green-100);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-s);
  font-size: 0.87rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--green-900);
}

.city-why__chips li::before {
  content: "";
  width: 6px;
  height: 6px;
  margin-top: 0.42em;
  border-radius: 50%;
  background: var(--amber-500);
  flex-shrink: 0;
}

/* Phone: the 2-up grid is already the base, so this only trims
   what costs width — the panel padding, the chip padding and the
   type — to keep the wrapped terms to two lines rather than three. */
@media (max-width: 560px) {
  .city-why__panel   { padding: 20px 18px; }
  .city-why__chips li { padding: 10px 12px; font-size: 0.78rem; }
}


/* ------------------------------------------------------------
   CALLOUT — the old page's orange "CHIAMA SUBITO" line, which was
   two inline-styled spans. No inline styles here (CSS rule 3).
------------------------------------------------------------ */
.city-callout {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2xs) var(--space-xs);
  margin: 0 0 var(--space-s) !important;
  padding: var(--space-s) var(--space-m);
  background: var(--amber-050);
  border-radius: var(--radius-m);
  border: 1px solid var(--line-200);
}

.city-prose__col .city-callout__tel {
  color: var(--amber-600);
  font-size: clamp(1.15rem, 1rem + 0.7vw, 1.4rem);
  text-decoration: none;
  line-height: 1.2;
}

.city-prose__col .city-callout__tel:hover { text-decoration: underline; }

.city-callout__tag {
  color: var(--amber-600) !important;
  font-size: clamp(0.95rem, 0.88rem + 0.35vw, 1.15rem);
  line-height: 1.3;
}


/* ------------------------------------------------------------
   SPLIT PROSE — copy left, photo right, from 992px up.
   Modifier-scoped so section 5, which shares .city-prose, stays
   one column.
------------------------------------------------------------ */
.city-prose__grid {
  display: grid;
  gap: clamp(32px, 4vw, 56px);
  grid-template-columns: minmax(0, 1fr);
  align-items: center;
}

.city-prose--split .city-prose__col { max-width: none; }

.city-prose__media { min-width: 0; }

/* No aspect-ratio here on purpose. The file is 747x499 and the
   markup carries those as width/height, so the browser reserves
   the right box from the attributes alone — the photo is shown
   whole rather than cropped to a ratio the CSS picked. */
.city-prose__img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: var(--radius-l);
  box-shadow: var(--shadow-pop);
}

/* A wide banner file (riparazione-elettrici-brescia: pronto-intervento-
   24.png, 612 x 218) reads as a thin strip at column width. The owner
   asked for it larger (2026-09-29): shown in a taller 16:10 frame,
   filled edge to edge and cropped at the sides, kept on the bulb. */
.city-prose__img--banner {
  aspect-ratio: 16 / 10;
  object-fit: cover;
  object-position: 72% 50%;
}

/* Below the split the photo would stretch to the full text
   measure, which is far wider than it is tall. Cap it. */
@media (max-width: 991px) {
  .city-prose__media { max-width: 520px; margin-inline: auto; }
}

/* elettricista-roma's own addition: a lead-in + paragraph sitting
   under the split photo. No sibling city page puts text in this
   column, only the image, so nothing shared covers it. */
.city-prose__note { margin-top: var(--space-m); }

.city-prose__note-title {
  margin: 0 0 var(--space-2xs);
  font-size: 1.05rem;
  color: var(--green-900);
}

.city-prose__note p:not(.city-prose__note-title) {
  margin: 0;
  font-size: 0.96rem;
  line-height: 1.7;
  color: var(--ink-700);
}

/* elettricista-terni: two bullet lists sit under the split photo,
   in the media column global.css's own <ul> reset (list-style:none)
   would otherwise leave unmarked. */
.city-prose__media ul {
  margin: 0 0 var(--space-s);
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}

.city-prose__media ul li {
  display: flex;
  gap: var(--space-2xs);
  font-size: 0.93rem;
  line-height: 1.6;
  color: var(--ink-700);
}

.city-prose__media ul li::before {
  content: "\2013";
  color: var(--amber-500);
  font-weight: 700;
  flex-shrink: 0;
}

@media (min-width: 992px) {
  .city-prose--split .city-prose__grid {
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);
  }

  /* Two lines, not four. The copy column is ~490px at 992px and
     ~680px at 1440px; the H2's longest natural line is
     "Riparazioni Urgenti – Elettricista Vicino a Me" (~23em in
     Archivo 800), so the clamp is sized to keep that inside the
     column at both ends. .section-title's own floor is 1.75rem,
     which is why this override exists at all — but it applies
     ONLY inside .city-prose--split, so every other .section-title
     on this page and on the parent page is untouched. */
  .city-prose--split .section-title {
    font-size: clamp(1.25rem, 0.7rem + 0.95vw, 1.75rem);
    line-height: 1.2;
  }

  /* One line for the callout. Sized to fit, but flex-wrap stays on
     as the safety net: if a font substitution makes it wider than
     the estimate it wraps to two lines instead of overflowing the
     column and giving the page a horizontal scrollbar. */
  .city-prose--split .city-callout {
    gap: var(--space-2xs);
    padding: var(--space-xs) var(--space-s);
  }

  .city-prose--split .city-callout__tel {
    font-size: clamp(0.82rem, 0.52rem + 0.52vw, 1.05rem);
    white-space: nowrap;
  }

  .city-prose--split .city-callout__tag {
    font-size: clamp(0.68rem, 0.44rem + 0.42vw, 0.88rem);
    white-space: nowrap;
  }
}


/* ------------------------------------------------------------
   IMAGE CAPTION — elettricista-valle-daosta: four images (the
   split photo and three of its Servizi icons) are WordPress
   [caption] figures with a visible "pronto intervento 24" line
   under them in the export — real copy, not metadata. No sibling
   page has visible caption text under an image.
------------------------------------------------------------ */
.img-caption {
  margin: var(--space-2xs) 0 0;
  font-size: 0.78rem;
  color: var(--ink-500);
  text-align: center;
}


/* ------------------------------------------------------------
   FEATURE CARD, HEADINGLESS TITLE — elettricista-ticino's intro
   row (Riparazione / Manutenzione / Installazione) has no heading
   at all in the export, just a bold lead line in a <p> (hard rule
   9 keeps it that way). global.css's .feature-card only styles a
   real h2-h6 as its title, so this gives a plain paragraph the
   same treatment.
------------------------------------------------------------ */
.feature-card__lead {
  margin: 0 0 12px;
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1rem + 0.3vw, 1.2rem);
  font-weight: 700;
  line-height: 1.3;
  color: var(--green-900);
}


/* ------------------------------------------------------------
   CITY DIRECTORY — elettricista-ticino's "Dove Operiamo" row of
   place-name headings, two of them linked. Nothing shared covers a
   plain fluid row of headings with no card chrome around them.
------------------------------------------------------------ */
.city-directory {
  --col-min: 160px;
  --gap: var(--space-m);
  --cols-max: 4;
  display: grid;
  gap: var(--gap);
  grid-template-columns: repeat(
    auto-fit,
    minmax(
      max(min(var(--col-min), 100%),
          (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),
      1fr
    )
  );
  text-align: center;
}

.city-directory h4 {
  margin: 0;
  font-size: 1.05rem;
}

.city-directory h4 a {
  color: var(--green-700);
  text-decoration: underline;
}

.city-directory h4 a:hover { color: var(--green-900); }


/* ------------------------------------------------------------
   SERVICE CARDS — 256px transparent icon + H4 + paragraph.
   global.css's .service-card is a 4/3 photo card with object-fit
   cover, which would crop these icons; this is a card built
   around a centred icon instead.
   Fluid grid — a seventh card would need no new CSS.
------------------------------------------------------------ */
.city-services { background: var(--paper-000); }

.city-services__head { margin-bottom: var(--space-l); }

/* A standalone CHIAMA button that follows the whole card grid,
   not tied to any one card — elettricista-busto-arsizio's own
   export has one of these after its 2x2 grid. .btn is
   inline-flex, so centring its <p> wrapper is enough; no other
   city page needs this; it stays out of the way of every page
   that doesn't add the class. */
.city-services__cta { text-align: center; margin-top: var(--space-l); }

.city-svc-grid {
  --col-min: 300px;
  --gap: clamp(20px, 2.4vw, 32px);
  --cols-max: 3;
  display: grid;
  gap: var(--gap);
  grid-template-columns: repeat(
    auto-fit,
    minmax(
      max(min(var(--col-min), 100%),
          (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),
      1fr
    )
  );
}

/* Two-up instead of the default three. The base grid above reads
   --cols-max, so capping the variable is the whole override — no
   media query, and it still collapses to one column on a phone
   because --col-min governs there.

   elettricista-varese: four cards, laid out 2 per row in the
   export (vc_col-sm-6), which is 2 x 2 rather than 3 + 1. */
.city-svc-grid--2up { --cols-max: 2; }

.city-svc-card {
  display: flex;
  flex-direction: column;
  background: var(--paper-000);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  box-shadow: var(--shadow-card);
  padding: clamp(24px, 3vw, 32px);
  transition: transform .22s cubic-bezier(.2,.7,.3,1),
              box-shadow .22s cubic-bezier(.2,.7,.3,1),
              border-color .22s ease;
}

.city-svc-card:hover,
.city-svc-card:focus-within {
  transform: translateY(-4px);
  border-color: transparent;
  box-shadow: var(--shadow-pop);
}

.city-svc-card__media {
  display: grid;
  place-items: center;
  width: clamp(76px, 11vw, 96px);
  height: clamp(76px, 11vw, 96px);
  margin: 0 auto var(--space-s);
  border-radius: 50%;
  background: var(--green-100);
  transition: background .22s ease;
}

.city-svc-card:hover .city-svc-card__media { background: var(--amber-050); }

.city-svc-card__media img {
  width: clamp(42px, 6vw, 54px);
  height: clamp(42px, 6vw, 54px);
  object-fit: contain;
}

.city-svc-card h4 {
  margin: 0 0 var(--space-xs);
  text-align: center;
  color: var(--green-900);
  font-size: clamp(1rem, 0.94rem + 0.3vw, 1.15rem);
  line-height: 1.3;
  letter-spacing: 0;
}

/* elettricista-latina: all four card titles are plain <p>s in the
   export, not headings (hard rule 9 keeps them that way), so they
   need the h4 treatment above without the h4 element. Font-family
   and font-weight are set explicitly because a <p> doesn't inherit
   either from global.css's heading rule the way h4 does. */
.city-svc-card__title {
  margin: 0 0 var(--space-xs);
  text-align: center;
  color: var(--green-900);
  font-family: var(--font-display);
  font-size: clamp(1rem, 0.94rem + 0.3vw, 1.15rem);
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: 0;
}

.city-svc-card h4 a {
  color: inherit;
  text-decoration: none;
}

.city-svc-card h4 a:hover,
.city-svc-card h4 a:focus-visible {
  color: var(--amber-600);
  text-decoration: underline;
}

.city-svc-card p {
  margin: 0;
  font-size: 0.96rem;
  line-height: 1.7;
  color: var(--ink-700);
  text-align: center;
}

/* elettricista-brescia's CORTO CIRCUITO card carries two
   paragraphs where every other card carries one. */
.city-svc-card p + p { margin-top: var(--space-xs); }

/* elettricista-udine's sixth card is a plain keyword list instead
   of a paragraph — the same dash-bullet shape .city-prose__media ul
   already styles for elettricista-terni, reproduced here scoped to
   .city-svc-card since global.css's list reset (list-style:none)
   would otherwise leave it unmarked. */
.city-svc-card ul {
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}

.city-svc-card ul li {
  display: flex;
  gap: var(--space-2xs);
  font-size: 0.93rem;
  line-height: 1.6;
  color: var(--ink-700);
}

.city-svc-card ul li::before {
  content: "\2013";
  color: var(--amber-500);
  font-weight: 700;
  flex-shrink: 0;
}

.city-svc-card p strong { color: var(--green-900); }

.city-svc-card p a {
  color: var(--green-500);
  font-weight: 700;
  text-decoration: underline;
}

.city-svc-card p a:hover { color: var(--green-700); }

/* elettricista-bergamo ends two of its cards with a call line.
   One of them is an <h4> in the export, used as a button — the
   heading stays (hard rule 9), it just stops looking like a
   section title sitting in the middle of body copy. */
/* Sits directly under the paragraph it belongs to, not pushed to
   the foot of the card. It was margin-top:auto, which bottom-
   aligned the call lines across a row — but the cards stretch to
   the tallest in the row, so on pavia the short "Riparazioni
   Elettriche" card ended up with its call line stranded a long
   way below its own text, next to the tall province map. */
.city-svc-card__cta {
  margin-top: var(--space-s);
  text-align: center;
  font-size: 1rem !important;
  font-weight: 700;
  letter-spacing: 0;
}

/* THE CALL BUTTON: FULL WIDTH, LABEL ON ONE LINE.

   global.css's .btn is inline-flex with 28px of side padding, a
   20px .icon-phone, a 10px gap and font-size:1rem. "CHIAMA
   SUBITO 01118838242" at that size is wider than a card in the
   three-up grid, so the button overflowed its own card: the
   parent's text-align:center cannot centre a box wider than its
   line, and it sat flush against the right border with the full
   card padding still showing on the left, reading as badly
   off-centre.

   width:100% with display:flex fixes the centring structurally
   rather than arithmetically: the button now IS the card's
   content box, so its left and right margins are the card's own
   padding and are equal by construction at every width, with no
   dependency on how wide the label happens to render.
   justify-content:center from global.css then centres the icon
   and label inside it.

   That leaves only "does the label fit on one line". The side
   padding drops to 8px, the icon gap to 8px, and the font-size
   is fluid so the label scales with the viewport instead of
   wrapping.

   THE TIGHT WIDTHS ARE THE GRID'S COLUMN TRANSITIONS, not the
   extremes. .city-svc-grid is auto-fit with --col-min:300px and
   --cols-max:3, so cards are at their NARROWEST just after the
   grid gains a column — around 768px (1->2) and around 1240px
   (2->3) — and get wider again above each. A 320px phone is the
   other constraint, where --gutter bottoms out at 20px and the
   card's padding at 24px.

   The clamp is sized for those three points rather than for the
   widest desktop. Worth eyeballing at ~768px and ~1240px if the
   label on a future page runs longer than the 24–25 characters
   these three carry; a longer one may need the ceiling lowered
   again.

   min-height stays 44px — global.css marks that as a tap target
   and it is untouched, so the button remains a legal touch size
   even at the smallest font.

   min-height stays 44px — global.css marks that as a tap target
   and it is untouched, so the button stays a legal touch size
   even at the smallest font.

   Scoped to this slot, so no other .btn on the site changes.
   Three pages have a button here: ancona, lugano, torino. */
.city-svc-card__cta .btn {
  display: flex;
  width: 100%;
  padding-inline: var(--space-2xs);
  gap: var(--space-2xs);
  white-space: nowrap;
  font-size: clamp(0.68rem, 0.5rem + 0.7vw, 0.85rem);
}

/* Element qualifiers on purpose. The plain .city-svc-card__cta a
   selector (0,1,1) loses to .city-svc-card p a and
   .city-svc-card h4 a (both 0,1,2) above, which coloured these
   green and underlined them. These are (0,2,2) and win.

   Three elements because the export is inconsistent about what it
   wraps the call line in: a <p> on bergamo card 2, an <h4> on
   bergamo card 4, an <h3> on pavia card 4. */
.city-svc-card :is(p, h3, h4).city-svc-card__cta a {
  color: var(--amber-600);
  font-weight: 700;
  text-decoration: none;
}

.city-svc-card :is(p, h3, h4).city-svc-card__cta a:hover { text-decoration: underline; }

.city-svc-card h3.city-svc-card__cta { color: var(--amber-600); }

/* elettricista-lugano card 6: the export's trailing CTA there is a
   real vc_btn3 button, not a text call line like the others above —
   .btn--primary already colours it white on an amber fill. Without
   this, the a.btn rule above still wins (0,2,2) and paints the
   button's own label and icon amber-on-amber, invisible. */
.city-svc-card :is(p, h3, h4).city-svc-card__cta a.btn {
  color: var(--paper-000);
}

/* elettricista-ancona card 6: the button sits directly above a
   trailing photo (.city-map, reused here for a plain image, not a
   province map). !important because .city-svc-card__cta's own
   margin-top already loses to .city-svc-card p's margin:0 reset
   (0,1,1 beats 0,1,0) — the only way to guarantee a small, fixed
   gap here without touching either of those shared rules. */
.city-svc-card__cta + .city-map {
  margin-top: var(--space-2xs) !important;
}

/* The province map card: an image and a button, no heading and no
   copy, so it opts out of the icon-circle treatment above. */
.city-svc-card--map {
  align-items: center;
  justify-content: center;
  gap: var(--space-m);
}

/* width:auto, not 100%. The province maps differ in size per page
   — bergamo's gif is 342x303, pavia's is 676x600 — so a fixed
   percentage either upscales the small one into mush or caps the
   large one arbitrarily. At auto each renders at its own native
   width and only shrinks when the card is narrower. */
.city-map {
  display: block;
  width: auto;
  max-width: 100%;
  height: auto;
  margin-inline: auto;
}

.city-map__cta { align-self: center; }

/* elettricista-perugia's map is 500x622 — much taller relative to
   its width than Bergamo's (342x303) or Pavia's (676x600), so at
   its native size it towered over the card beside it. Capped
   smaller here rather than changing .city-map's own default,
   which every other map card still renders at native size. */
.city-map--sm { max-width: 240px; }

/* ------------------------------------------------------------
   LAST ROW FILLS THE WIDTH — .city-svc-grid--last-even

   A 5-card grid is 3 + 2, so the last row held two cards at a
   third of the width each and left a third of the row empty.

   Fixed by counting in sixths: a normal card spans 2 of 6 (three
   per row, unchanged) and the last two span 3 of 6 each, filling
   the final row as equal halves.

   A 2 + 4 variant was tried for elettricista-monza, matching the
   export's own vc_col-sm-4 + vc_col-sm-8 there, and dropped —
   equal halves read better on both pages. To bring it back, span
   the last two 2 and 4 instead of 3 and 3.

   Only from 1100px, which is where the base grid actually reaches
   3 columns — --col-min is 300px, so 3 columns plus gaps need
   ~950px of container, and the container only gets there around a
   1055px viewport. Below that the fluid grid keeps its own 2-up
   and 1-up behaviour and this override stays out of the way.

   Modifier-scoped, so a grid without it is untouched. Used by
   elettricista-bergamo and elettricista-monza.
------------------------------------------------------------ */
@media (min-width: 1100px) {
  .city-svc-grid--last-even {
    grid-template-columns: repeat(6, minmax(0, 1fr));
  }

  .city-svc-grid--last-even > * { grid-column: span 2; }

  .city-svc-grid--last-even > :nth-last-child(2),
  .city-svc-grid--last-even > :last-child { grid-column: span 3; }
}


/* ------------------------------------------------------------
   PROVINCE LIST — a directory panel: one white card on a tinted
   band, the towns set in CSS columns as hairline-separated rows.

   Chosen over the previous dark card grid for two reasons. It is
   about a third shorter — 100 boxed cards ran ~1250px tall, these
   rows run ~850px — and it stops .city-area and the .closing band
   right after it from reading as two dark slabs in a row.

   The 100 names are a single justified paragraph of pipe-
   separated text in the export. Every name survives, in the old
   order; only the "|" delimiters and <br>s are gone, because the
   row boundaries now do that job (hard rule 7 — rearranged, not
   cut).

   The markup did not change when this design replaced the last
   one: same section, same 100 spans. Only this block was rewritten.

   The pin is a CSS mask rather than 100 inline <svg>s: same mark,
   ~20KB less HTML, colour still from a token via `background`.
------------------------------------------------------------ */
.city-area {
  background: var(--green-050);
  padding-block: clamp(56px, 8vw, 88px);
}

.city-area__inner {
  width: min(100% - (var(--gutter) * 2), var(--max-w));
  margin-inline: auto;
  background: var(--paper-000);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  box-shadow: var(--shadow-card);
  padding: clamp(24px, 4vw, 48px);
}

/* Full-width rule under the heading with an amber segment sitting
   on top of it at the left. */
.city-area__title {
  position: relative;
  margin: 0 0 var(--space-m);
  padding-bottom: var(--space-s);
  border-bottom: 2px solid var(--line-200);
  color: var(--green-900);
  font-size: clamp(1.1rem, 1rem + 0.5vw, 1.45rem);
  font-weight: 800;
  letter-spacing: 0;
}

.city-area__title::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -2px;
  width: 72px;
  height: 2px;
  background: var(--amber-500);
}

/* Columns, not a grid: names flow down each column and across,
   which is how a directory is read, and a short name takes a
   short row instead of a fixed card.

   Explicit counts rather than an automatic column-width. Getting
   5 columns on a wide screen from `columns: <width> 5` needs a
   minimum low enough (~150px) that tablet also jumps to 4, where
   a 150px column is far too narrow for these names. Fixed counts
   per breakpoint keep the narrow widths sane.

   On wrapping: "Elettricista " is 13 characters before the town
   name even starts, and the longest entry is "Elettricista San
   Colombano al Lambro" at 36. Of the 100 names, 48 are over 22
   characters and 17 are over 30. The container is capped at
   --max-w, so the widest the content ever gets is ~1144px — at 5
   columns that is ~187px of text per row, and roughly a third of
   the names take two rows.

   To change the ceiling, edit the last media query only:
     5 -> a third of names wrap; no shorter than 4 (see below)
     4 -> the longest ~5 names wrap on a wide screen
     3 -> effectively no wrapping, widest rows */
.city-area__cities {
  column-count: 2;
  column-gap: clamp(20px, 2.5vw, 40px);
  margin: 0;
}

@media (min-width: 760px)  { .city-area__cities { column-count: 3; } }
@media (min-width: 1000px) { .city-area__cities { column-count: 4; } }
@media (min-width: 1240px) {
  .city-area__cities {
    column-count: 5;
    column-gap: 24px;   /* tighter, to buy back text width */
  }
}

.city-area__city {
  display: flex;
  align-items: center;
  gap: 9px;
  break-inside: avoid;
  padding: 9px 0;
  border-bottom: 1px solid var(--line-100);
  font-size: 0.85rem;
  font-weight: 600;
  line-height: 1.4;
  color: var(--green-900);
}

.city-area__city::before {
  content: "";
  width: 14px;
  height: 14px;
  flex-shrink: 0;
  background: var(--amber-500);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8'%3E%3Cpath d='M12 21C12 21 5 14.5 5 9.5C5 5.9 8.1 3 12 3C15.9 3 19 5.9 19 9.5C19 14.5 12 21 12 21Z'/%3E%3Ccircle cx='12' cy='9.5' r='2.3'/%3E%3C/svg%3E") center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8'%3E%3Cpath d='M12 21C12 21 5 14.5 5 9.5C5 5.9 8.1 3 12 3C15.9 3 19 5.9 19 9.5C19 14.5 12 21 12 21Z'/%3E%3Ccircle cx='12' cy='9.5' r='2.3'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Two columns on a phone leaves only ~130px of text per row, so
   everything that costs width gets trimmed: the panel padding,
   the column gap, the pin and the type. Names still wrap here —
   at this width they would have to — but this keeps most of them
   to two rows rather than three. */
@media (max-width: 560px) {
  .city-area__inner  { padding: 20px 16px; }
  .city-area__cities { column-gap: 14px; }
  .city-area__city   { font-size: 0.78rem; padding: 7px 0; gap: 7px; }
  .city-area__city::before { width: 12px; height: 12px; }
}


/* ------------------------------------------------------------
   KEYWORD LIST — elettricista-varese's closing section.

   13 items that the export splits across three <ul>s of 6, 4 and
   3. One list here, laid out by the same fluid grid the rest of
   the page uses, so the count never needs new CSS.

   The element inside each <li> varies by page — <h5> on twelve
   pages, <h4> on elettricista-carrara, <strong> on
   elettricista-vicenza — and each page keeps its own (hard
   rule 9). The typography therefore sits on the li, and every
   element that might wrap the text is reset to inherit from it,
   so the panel looks identical on all fourteen pages.
------------------------------------------------------------ */
.city-kw { background: var(--green-050); }

.city-kw__panel {
  background: var(--paper-000);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  box-shadow: var(--shadow-card);
  padding: clamp(24px, 4vw, 44px);
  text-align: center;
}

.city-kw__title {
  margin: 0 0 var(--space-m);
  color: var(--green-900);
  font-size: clamp(1.2rem, 1.05rem + 0.8vw, 1.6rem);
  font-weight: 800;
  letter-spacing: 0;
}

.city-kw__list {
  --col-min: 240px;
  --gap: var(--space-2xs);
  --cols-max: 3;
  list-style: none;
  margin: 0 0 var(--space-l);
  padding: 0;
  display: grid;
  gap: var(--gap);
  grid-template-columns: repeat(
    auto-fit,
    minmax(
      max(min(var(--col-min), 100%),
          (100% - (var(--gap) * (var(--cols-max) - 1))) / var(--cols-max)),
      1fr
    )
  );
  text-align: left;
}

/* The item's typography lives HERE, on the li, not on whatever
   element the export happened to wrap the text in. See the reset
   below for why. */
.city-kw__list li {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2xs);
  padding: 10px 14px;
  background: var(--green-100);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-s);
  font-family: var(--font-body);
  font-size: 0.88rem;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: 0;
  color: var(--green-900);
}

.city-kw__list li::before {
  content: "";
  width: 6px;
  height: 6px;
  margin-top: 0.5em;
  border-radius: 50%;
  background: var(--amber-500);
  flex-shrink: 0;
}

/* WHATEVER THE EXPORT WRAPPED THE ITEM IN, IT IS A LIST ITEM, NOT
   A SECTION TITLE. The wrapper is not consistent across the run —
   twelve pages use <h5>, elettricista-carrara uses <h4>, and
   elettricista-vicenza uses <strong> with no heading at all — and
   hard rule 9 freezes each page's own level. So the reset has to
   cover every element the markup might carry rather than naming
   one.

   Before this existed, only h5 was reset, so carrara's h4 items
   fell through to global.css's h4 rule (clamp(1.1rem,…,1.3rem)/700
   in --font-display) and rendered noticeably bigger and bolder
   than the same panel on every sibling page; vicenza's bare
   <strong> items rendered at body size. Both now inherit from the
   li and match. */
.city-kw__list li :is(h1, h2, h3, h4, h5, h6, strong, b, span) {
  margin: 0;
  font: inherit;
  letter-spacing: inherit;
  color: inherit;
}

@media (max-width: 480px) {
  /* One line, always: .btn is white-space:nowrap and this button sits in
     a narrow panel, so the old long label ran out of both sides of the
     pill. Tighter side padding and slightly smaller type, together with the
     short "CHIAMA {numero}" label (owner request), keep it inside to 320px. */
  .city-kw__cta { width: 100%; justify-content: center; padding-inline: 14px; gap: 8px; }
  .city-kw__cta .btn__label { font-size: 0.85rem; }
}


/* ------------------------------------------------------------
   CLOSING BAND — .closing is defined above for the parent page,
   which closes on an h2. This page's closing heading is an h3
   (hard rule 9: the old page's hierarchy is preserved), so it
   needs the same treatment at its own level.
------------------------------------------------------------ */
.closing h3 {
  margin: 0 0 var(--space-l);
  font-size: clamp(1.25rem, 1.05rem + 1vw, 1.75rem);
  font-weight: 800;
  color: var(--paper-000);
  line-height: 1.35;
  letter-spacing: -0.01em;
}

/* elettricista-velletri's closing heading is an h4 (hard rule 9
   again — its own hierarchy runs H1/H2/H3/H4, one level past
   Milano/Lodi's H3). Same treatment, one step down. */
.closing h4 {
  margin: 0 0 var(--space-l);
  font-size: clamp(1.1rem, 0.95rem + 0.8vw, 1.5rem);
  font-weight: 800;
  color: var(--paper-000);
  line-height: 1.35;
  letter-spacing: -0.01em;
}

@media (max-width: 480px) {
  .closing .btn { width: 100%; justify-content: center; }
}


/* ------------------------------------------------------------
   REPERIBILITÀ 24H BAND — elettricista-roma/elettricista-tivoli's
   .cta-band is stacked (lead+text, then button, then trust row)
   rather than global.css's default lead-and-button-side-by-side
   row, so it needs its own inner layout plus a trust row neither
   global.css nor the parent page has a use for.
------------------------------------------------------------ */
.cta-band__inner--stack {
  flex-direction: column;
  text-align: center;
}

.cta-band__text {
  margin: var(--space-2xs) 0 0;
  color: rgba(255, 255, 255, 0.9);
}

.cta-band__text a {
  color: inherit;
  text-decoration: underline;
}

.cta-band__trust {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-m);
  margin-top: var(--space-l);
  text-align: left;
}

@media (min-width: 760px) {
  .cta-band__trust {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  .cta-band__trust > * + * {
    border-left: 1px solid rgba(255, 255, 255, 0.3);
    padding-left: var(--space-m);
  }
}

.cta-band__trust-icon {
  width: 22px;
  height: 22px;
  color: var(--amber-400);
  margin-bottom: var(--space-2xs);
}

.cta-band__trust strong {
  display: block;
  margin-bottom: 4px;
  color: var(--paper-000);
  font-size: 0.98rem;
}

.cta-band__trust p {
  margin: 0;
  color: rgba(255, 255, 255, 0.85);
  font-size: 0.92rem;
  line-height: 1.55;
}


/* ------------------------------------------------------------
   SIX-ACROSS FEATURE GRID — elettricista-roma/elettricista-tivoli's
   six icon cards sit in one row instead of global.css's default
   3-per-row wrap. --col-min still governs collapse on narrow
   screens, so this only raises the ceiling; every other
   .features__grid on the site (it has no modifier here) keeps its
   default 3-column wrap.
------------------------------------------------------------ */
.features__grid--cols-6 { --cols-max: 6; }

/* global.css's --col-min:280px floor keeps auto-fit from ever
   actually reaching 6 tracks at typical desktop widths (six 280px+
   columns need ~1850px). These cards are icon + one line of text,
   so a fixed 6-up grid from desktop width up is a straightforward,
   explicit override rather than fighting the fluid formula's floor. */
@media (min-width: 900px) {
  .features__grid--cols-6 {
    grid-template-columns: repeat(6, minmax(0, 1fr));
  }
}

/* Six-up leaves much less width per card than global.css's default
   3-column grid sized its heading clamp for; scaled down to match. */
.features__grid--cols-6 .feature-card h4 {
  font-size: 0.85rem;
}


/* ------------------------------------------------------------
   SUB-HEADING INSIDE PROSE — elettricista-rovigo's prose band
   carries a SECOND h2 ("Elettricista Rovigo 24 ore") partway
   down, between paragraphs, where every other page's prose band
   has exactly one h2 and it is the section title.

   Hard rule 9 keeps it an h2, but it is a sub-heading inside
   running copy, not a section title, so it must not take
   .section-title's size. The :not() keeps every other page
   untouched — theirs all carry .section-title.

   Same idea as the .city-prose h3/h4 rule added for
   elettricista-udine, one level up.
------------------------------------------------------------ */
.city-prose h2:where(:not(.h1-look)):not(.section-title) {
  margin: var(--space-m) 0 var(--space-s);
  font-size: clamp(1.15rem, 1rem + 0.7vw, 1.45rem);
  font-weight: 800;
  line-height: 1.35;
  color: var(--green-900);
  letter-spacing: 0;
}


/* ------------------------------------------------------------
   CLOSING BAND, TWO COLUMNS — elettricista-rovigo's closing
   section is two vc_col-sm-6 columns, each a centred bold lead
   line over a paragraph, with one shared button underneath.

   Every other page's closing band is a single measured column, so
   .closing-inner keeps its 760px cap and this modifier widens it
   to the container instead. Modifier-scoped: a .closing-inner
   without it is untouched.
------------------------------------------------------------ */
.closing-inner--2up {
  width: min(100% - (var(--gutter) * 2), var(--max-w));
}

.closing__cols {
  display: grid;
  gap: var(--space-l);
  grid-template-columns: minmax(0, 1fr);
  margin-bottom: var(--space-l);
  text-align: left;
}

@media (min-width: 768px) {
  .closing__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* .closing p carries a --space-l bottom margin for the single-column
   case, where one paragraph sits above the button. Inside a column
   that would double up with the grid gap. */
.closing__cols p:last-child { margin-bottom: 0; }

.closing__lead {
  margin: 0 0 var(--space-2xs);
  color: var(--paper-000);
  font-weight: 700;
  text-align: center;
}

/* ------------------------------------------------------------
   HERO HEADLINE THAT IS NOT A HEADING — .hero__headline

   elettricista-carrara's export marks its hero headline up as a
   <p>, not an <h1>, while styling it like one (2.5em, white,
   centred). Its only <h1> sits halfway down the page, after the
   pricing block. Hard rule 9 fixes heading levels, so the <p>
   stays a <p> — promoting it would give the page two h1s — but
   hard rule 9 also says "how they look is free", and a page's
   opening statement should not render as body copy.

   This gives that paragraph the same type treatment
   global.css's .hero.hero--split h1 gives a real heading, one
   step down so it does not out-shout the h1 further down the
   page. Scoped to .hero--city so it cannot reach the homepage
   or the parent page, and keyed to a class no other page uses.

   If Carrara's markup is ever fixed in WordPress — hero
   headline promoted to h1, the current h1 demoted — this block
   stops matching anything and can be deleted.
------------------------------------------------------------ */
.hero--city .hero__headline {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(2.1rem, 1.4rem + 3vw, 3.6rem);
  font-weight: 900;
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--green-950);
  text-wrap: balance;
}

.hero--city .hero__headline strong { font-weight: inherit; }


/* ------------------------------------------------------------
   ALTERNATING PANELS — a run of <h4> + paragraph blocks shown as
   rounded rows (riparazione-elettrici-torino). Each row: a dark green
   panel holding the heading (white, orange accent bar) beside the
   paragraphs on a light card; from 992px the panel sits left on odd
   rows and right on even rows. The headings share one size (some old
   <h4>s carry <strong>, some don't). Panel above text on a phone.
------------------------------------------------------------ */
.city-zig { background: var(--paper-050); }

.city-zig__list {
  display: grid;
  gap: var(--space-m);
}

.city-zig__row {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  border-radius: var(--radius-l);
  overflow: hidden;
  background: var(--paper-000);
  box-shadow: var(--shadow-card);
}

@media (min-width: 992px) {
  .city-zig__row { grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); }

  .city-zig__row:nth-child(even) { grid-template-columns: minmax(0, 8fr) minmax(0, 4fr); }

  .city-zig__row:nth-child(even) .city-zig__head { order: 2; }
}

.city-zig__head {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: clamp(24px, 3vw, 40px);
  background: linear-gradient(150deg, var(--green-900) 0%, var(--green-800) 100%);
}

.city-zig__head::before {
  content: "";
  width: 44px;
  height: 4px;
  margin-bottom: var(--space-s);
  border-radius: var(--radius-s);
  background: var(--amber-500);
}

.city-zig__head h4 {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(1.15rem, 1rem + 0.55vw, 1.4rem);
  font-weight: 800;
  line-height: 1.3;
  color: var(--paper-000);
}

.city-zig__head h4 strong { font-weight: inherit; }

.city-zig__body {
  padding: clamp(24px, 3vw, 40px);
}

.city-zig__body p {
  margin: 0 0 var(--space-s);
  font-size: 1rem;
  line-height: 1.75;
  color: var(--ink-700);
}

.city-zig__body p:last-child { margin-bottom: 0; }

.city-zig__body a {
  color: var(--amber-600);
  font-weight: 700;
}

.city-zig__body a:hover { color: var(--amber-500); }

/* ------------------------------------------------------------
   PROSE SUB-SECTIONS + CHIPS (riparazione-elettrici-roma).
   .section-title--sub: an <h3> that opens a block inside a prose
   band — a step down from the band-opening .section-title, so a run
   of them doesn't read as a stack of page titles.
   .city-chips: a short keyword list as tiles, the same look as
   .city-why__chips, auto-filling columns; a linked item keeps its
   link, in amber.
------------------------------------------------------------ */
.city-prose .section-title--sub {
  margin: var(--space-l) 0 var(--space-s);
  font-size: clamp(1.35rem, 1.1rem + 0.9vw, 1.85rem);
  line-height: 1.2;
}

.city-prose .section-title--sub:first-child { margin-top: 0; }

.city-chips {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--space-2xs);
  grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr));
}

.city-chips li {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2xs);
  padding: var(--space-xs) var(--space-s);
  background: var(--green-100);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-s);
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--green-900);
}

.city-chips li::before {
  content: "";
  width: 7px;
  height: 7px;
  margin-top: 0.45em;
  border-radius: 50%;
  background: var(--amber-500);
  flex-shrink: 0;
}

.city-prose__col .city-chips a {
  color: var(--amber-600);
  font-weight: 700;
}

.city-prose__col .city-chips a:hover { color: var(--amber-500); }

/* ------------------------------------------------------------
   FEATURE STRIP + PHOTO CAPTION (impianti-allarme-e-antifurto-
   milano).
   .city-feats: four one-word features (the old page's bold <p>s under
   its icon font) as tiles with a decorative SVG badge; auto-fill
   columns, so any count lays out without new CSS.
   .city-prose__caption: the old image caption under a split photo;
   the <figure> wrapper loses its default margin.
------------------------------------------------------------ */
.city-feats {
  background: var(--green-050);
  padding-block: var(--space-xl);
}

.city-feats__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--gap);
  grid-template-columns: repeat(auto-fill, minmax(min(200px, 100%), 1fr));
}

.city-feats__item {
  display: flex;
  align-items: center;
  gap: var(--space-s);
  padding: var(--space-m);
  background: var(--paper-000);
  border: 1px solid var(--line-200);
  border-radius: var(--radius-l);
  box-shadow: var(--shadow-card);
}

.city-feats__icon {
  display: grid;
  place-items: center;
  flex: 0 0 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--amber-050);
  color: var(--amber-600);
}

.city-feats__icon svg { width: 24px; height: 24px; }

.city-feats__item p {
  margin: 0;
  font-family: var(--font-display);
  font-size: 1.1rem;
  line-height: 1.2;
  color: var(--green-900);
}

figure.city-prose__media { margin: 0; }

.city-prose__caption {
  margin-top: var(--space-xs);
  font-size: 0.85rem;
  color: var(--ink-500);
  text-align: center;
}

/* ------------------------------------------------------------
   PREVENTIVO PAGE (preventivi/intervento-elettricista-torino).
   .hero__actions h3: the old page's two hero call links are <h3>s
   (heading level kept, hard rule 9); the heading steps aside so the
   .btn inside carries all the styling.
   .city-svc-card--link: on the old page each service card is ONE
   link (icon, <h4> title, text). The card is the <a>: no underline,
   body text keeps its colour, the title turns amber on hover/focus.
------------------------------------------------------------ */
.hero__actions h3 {
  margin: 0;
  font: inherit;
  letter-spacing: inherit;
}

a.city-svc-card--link {
  color: inherit;
  text-decoration: none;
}

a.city-svc-card--link:hover h4,
a.city-svc-card--link:focus-visible h4 { color: var(--amber-600); }

a.city-svc-card--link:focus-visible {
  outline: 3px solid var(--green-500);
  outline-offset: 3px;
}

.city-svc-card__text {
  display: block;
  font-size: 0.96rem;
  line-height: 1.7;
  color: var(--ink-700);
  text-align: center;
}

/* ------------------------------------------------------------
   SERVICES, DARK VARIANT (preventivi/intervento-elettricista-torino,
   owner 2026-09-29). Four linked cards read as an orphaned row in the
   3-up grid, so: a dark band, a strict 2 x 2 grid, and horizontal
   cards — icon badge left, title + text right, left-aligned, with a
   small decorative arrow that nudges on hover. One column below 760px.
------------------------------------------------------------ */
.city-services--dark {
  background: linear-gradient(160deg, var(--green-900) 0%, var(--green-800) 100%);
}

.city-services--dark .section-title { color: var(--paper-000); }

.city-svc-grid.city-svc-grid--rows {
  display: grid;
  gap: var(--gap);
  grid-template-columns: minmax(0, 1fr);
}

@media (min-width: 760px) {
  .city-svc-grid.city-svc-grid--rows { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.city-svc-card.city-svc-card--row {
  position: relative;
  flex-direction: row;
  align-items: flex-start;
  gap: var(--space-m);
  padding: clamp(22px, 2.6vw, 30px);
  padding-right: clamp(48px, 5vw, 60px);
  border: 0;
  border-left: 4px solid var(--amber-500);
}

.city-svc-card--row .city-svc-card__media {
  flex: 0 0 auto;
  width: clamp(60px, 7vw, 72px);
  height: clamp(60px, 7vw, 72px);
  margin: 0;
  background: var(--amber-050);
}

.city-svc-card--row .city-svc-card__media img {
  width: clamp(34px, 4vw, 42px);
  height: clamp(34px, 4vw, 42px);
}

.city-svc-card__body { min-width: 0; }

.city-svc-card--row h4 {
  margin: 0 0 var(--space-2xs);
  text-align: left;
}

.city-svc-card--row .city-svc-card__text { text-align: left; }

.city-svc-card__arrow {
  position: absolute;
  right: clamp(16px, 2vw, 22px);
  bottom: clamp(16px, 2vw, 22px);
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: var(--green-100);
  color: var(--amber-600);
  transition: transform .22s ease, background .22s ease;
}

.city-svc-card__arrow svg { width: 18px; height: 18px; }

a.city-svc-card--row:hover .city-svc-card__arrow,
a.city-svc-card--row:focus-visible .city-svc-card__arrow {
  transform: translateX(4px);
  background: var(--amber-050);
}

@media (prefers-reduced-motion: reduce) {
  .city-svc-card__arrow { transition: none; }
  a.city-svc-card--row:hover .city-svc-card__arrow { transform: none; }
}
/* ============================================================
   consent.css — cookie banner (assets/js/consent.js), every page.
   global.css supplies tokens and .btn; nothing here redefines them.

   The bar sits at the bottom of the viewport. On phones it sits
   ABOVE the green call bar (global.css §20) instead of covering it:
   the call button must stay tappable while the banner is open.
============================================================ */

.cc{ display:none; }
.cc.cc--open{ display:block; }

.cc-bar{
  position:fixed;
  left:50%; transform:translateX(-50%);
  bottom:16px;
  z-index:10001;
  width:min(100% - 32px, 980px);
  max-height:calc(100vh - 120px);
  overflow:auto;
  background:var(--paper-000);
  color:var(--ink-900);
  border:1px solid var(--line-200);
  border-radius:var(--radius-m);
  box-shadow:0 18px 50px rgba(14,57,94,.22);
  padding:22px 24px 20px;
  font-size:.92rem;
  line-height:1.5;
}

@media (max-width:768px){
  .cc-bar{
    bottom:calc(var(--callbar-h) + env(safe-area-inset-bottom) + 8px);
    width:calc(100% - 16px);
    max-height:calc(100vh - var(--callbar-h) - 90px);
    padding:18px 16px 16px;
  }
}

.cc-title{
  margin:0 32px 8px 0;
  font-family:var(--font-display);
  font-weight:800;
  font-size:1.05rem;
  color:var(--green-900);
}

.cc-desc p, .cc-intro, .cc-cat p{
  margin:0 0 8px;
  color:var(--ink-700);
  font-size:.88rem;
}
.cc-desc a, .cc-intro a{ color:var(--green-700); text-decoration:underline; }

.cc-x{
  position:absolute; top:10px; right:12px;
  width:36px; height:36px;
  border:0; border-radius:50%;
  background:transparent;
  color:var(--ink-700);
  font-size:26px; line-height:1;
  cursor:pointer;
}
.cc-x:hover{ background:var(--line-100); }

.cc-actions{
  display:flex; flex-wrap:wrap; justify-content:flex-end; align-items:center;
  gap:10px;
  margin-top:12px;
}
.cc-actions .btn{ padding:12px 22px; font-size:.92rem; }

.cc-links{ display:none; }

/* Phones: keep the bar short so the page's own CHIAMA button and the
   green call bar stay usable while the banner is open.
   Rifiuta and Accetta keep the same size side by side (Garante 2021:
   rejecting must be as easy as accepting); "Impostazioni cookie"
   drops to a text link underneath. */
@media (max-width:600px){
  .cc-bar{ padding:14px 14px 12px; }
  .cc-title{ font-size:.98rem; margin-bottom:6px; }
  .cc-desc .cc-more{ display:none; }
  .cc-desc p, .cc-links{ font-size:.82rem; line-height:1.4; margin-bottom:6px; }
  .cc-links{ display:block; }
  .cc-links a{ color:var(--green-700); text-decoration:underline; }
  .cc-bar .cc-actions{
    display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-top:8px;
  }
  .cc-bar .cc-actions .btn{
    width:100%; min-height:44px; padding:10px 8px;
    font-size:.82rem; white-space:normal; line-height:1.2;
  }
  .cc-bar .cc-actions [data-cc="reject"]{ grid-column:1; grid-row:1; }
  .cc-bar .cc-actions [data-cc="accept"]{ grid-column:2; grid-row:1; }
  .cc-bar .cc-actions [data-cc="settings"]{ grid-column:1 / -1; grid-row:2; min-height:36px; padding:4px; }
  .cc-panel .cc-actions{ flex-direction:column-reverse; align-items:stretch; }
  .cc-panel .cc-actions .btn{ width:100%; }
}

/* While the banner is open the green call bar never slides away
   (site.js §4 hides it when another CHIAMA is on screen — here that
   button may sit under the banner). */
.cc-visible .call-bar.call-bar--hidden{ transform:none; }

/* ---- settings modal ---- */
.cc-modal{
  position:fixed; inset:0;
  z-index:10002;
  background:rgba(26,27,39,.55);
  display:flex; align-items:center; justify-content:center;
  padding:16px;
}
.cc-modal[hidden]{ display:none; }

.cc-panel{
  position:relative;
  width:min(100%, 640px);
  max-height:calc(100vh - 32px);
  overflow:auto;
  background:var(--paper-000);
  border-radius:var(--radius-m);
  box-shadow:0 24px 60px rgba(0,0,0,.3);
  padding:24px;
}

.cc-cat{
  border-top:1px solid var(--line-200);
  padding:14px 0 6px;
}
.cc-cat-head{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  margin-bottom:4px;
  cursor:pointer;
}
.cc-cat-name{ font-weight:700; color:var(--ink-900); }
.cc-always{ font-size:.8rem; font-weight:700; color:var(--live-500); }

/* Toggle switch built on a real checkbox (keyboard + screen reader) */
.cc-switch{
  appearance:none; -webkit-appearance:none;
  position:relative; flex-shrink:0;
  width:44px; height:26px; margin:0;
  border-radius:999px;
  background:var(--ink-500);
  cursor:pointer;
  transition:background .15s ease;
}
.cc-switch::after{
  content:""; position:absolute; top:3px; left:3px;
  width:20px; height:20px; border-radius:50%;
  background:var(--paper-000);
  transition:transform .15s ease;
}
.cc-switch:checked{ background:var(--green-700); }
.cc-switch:checked::after{ transform:translateX(18px); }
.cc-switch:focus-visible{ outline:2px solid var(--amber-500); outline-offset:2px; }
