.elementor-kit-5{--e-global-color-primary:#1A2B4A;--e-global-color-secondary:#FAF8F4;--e-global-color-text:#5A6478;--e-global-color-accent:#A67C3F;--e-global-color-ink:#1A2B4A;--e-global-color-bg:#FAF8F4;--e-global-color-accenttext:#8A6633;--e-global-color-accentbutton:#7A5A2D;--e-global-color-muted:#5A6478;--e-global-color-border:#E5E0D8;--e-global-color-surface:#FFFFFF;--e-global-typography-primary-font-family:"Playfair Display";--e-global-typography-primary-font-weight:600;--e-global-typography-secondary-font-family:"Inter";--e-global-typography-secondary-font-weight:600;--e-global-typography-text-font-family:"Inter";--e-global-typography-text-font-size:18px;--e-global-typography-text-font-weight:400;--e-global-typography-text-line-height:1.65em;--e-global-typography-accent-font-family:"Inter";--e-global-typography-accent-font-weight:600;background-color:#FAF8F4;color:#1A2B4A;font-family:"Inter", Sans-serif;font-size:18px;font-weight:400;line-height:1.65em;}.elementor-kit-5 button,.elementor-kit-5 input[type="button"],.elementor-kit-5 input[type="submit"],.elementor-kit-5 .elementor-button{background-color:#1A2B4A;font-family:"Inter", Sans-serif;font-size:16px;font-weight:600;line-height:1em;color:#FAF8F4;border-radius:2px 2px 2px 2px;padding:16px 32px 16px 32px;}.elementor-kit-5 button:hover,.elementor-kit-5 button:focus,.elementor-kit-5 input[type="button"]:hover,.elementor-kit-5 input[type="button"]:focus,.elementor-kit-5 input[type="submit"]:hover,.elementor-kit-5 input[type="submit"]:focus,.elementor-kit-5 .elementor-button:hover,.elementor-kit-5 .elementor-button:focus{background-color:#7A5A2D;color:#FAF8F4;}.elementor-kit-5 e-page-transition{background-color:#FFBC7D;}.elementor-kit-5 a{color:#1A2B4A;text-decoration:underline;}.elementor-kit-5 a:hover{color:#8A6633;}.elementor-kit-5 h1{color:#1A2B4A;font-family:"Playfair Display", Sans-serif;font-size:52px;font-weight:600;line-height:1.15em;}.elementor-kit-5 h2{color:#1A2B4A;font-family:"Playfair Display", Sans-serif;font-size:38px;font-weight:600;line-height:1.2em;}.elementor-kit-5 h3{color:#1A2B4A;font-family:"Inter", Sans-serif;font-size:24px;font-weight:600;line-height:1.3em;}.elementor-kit-5 h4{color:#1A2B4A;font-family:"Inter", Sans-serif;font-size:20px;font-weight:600;line-height:1.4em;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1200px;}.e-con{--container-max-width:1200px;}.elementor-widget:not(:last-child){--kit-widget-spacing:24px;}.elementor-element{--widgets-spacing:24px 24px;--widgets-spacing-row:24px;--widgets-spacing-column:24px;}{}h1.entry-title{display:var(--page-title-display);}.site-header .site-branding{flex-direction:column;align-items:stretch;}.site-header{padding-inline-end:0px;padding-inline-start:0px;}.site-footer .site-branding{flex-direction:column;align-items:stretch;}@media(max-width:1024px){.elementor-section.elementor-section-boxed > .elementor-container{max-width:1024px;}.e-con{--container-max-width:1024px;}}@media(max-width:767px){.elementor-kit-5{font-size:16px;line-height:1.6em;}.elementor-kit-5 h1{font-size:34px;line-height:1.2em;}.elementor-kit-5 h2{font-size:28px;line-height:1.25em;}.elementor-kit-5 h3{font-size:21px;line-height:1.35em;}.elementor-kit-5 h4{font-size:18px;line-height:1.4em;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:767px;}.e-con{--container-max-width:767px;}}
/* Start custom CSS *//* ============================================================
   KADIMA - Global Kit CSS
   Source: build/elementor-kit-custom.css (fuente local de verdad)
   Base estructural de 4A + las doce clases de 4D.
   ============================================================ */

:root {
  --e-global-color-ink: #1A2B4A;
  --e-global-color-bg: #FAF8F4;
  --e-global-color-accent-text: #8A6633;
  --e-global-color-accent-button: #7A5A2D;
  --e-global-color-muted: #5A6478;
  --e-global-color-border: #E5E0D8;
  --e-global-color-surface: #FFFFFF;
}

/* ---------- FAQ block - Decision 09.5 (highest-risk item) ---------- */
.kadima-faq details { border-bottom: 1px solid var(--e-global-color-border); padding: 20px 0; }
.kadima-faq details:last-of-type { border-bottom: none; }
.kadima-faq summary {
  cursor: pointer; list-style: none; display: flex;
  justify-content: space-between; align-items: center; gap: 16px;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 20px; line-height: 1.35; color: var(--e-global-color-ink);
}
.kadima-faq summary::-webkit-details-marker { display: none; }
.kadima-faq summary::after {
  content: ""; flex: 0 0 10px; width: 10px; height: 10px;
  border-right: 2px solid var(--e-global-color-accent);
  border-bottom: 2px solid var(--e-global-color-accent);
  transform: rotate(45deg); transition: transform .2s ease;
}
.kadima-faq details[open] summary::after { transform: rotate(-135deg); }
.kadima-faq details > p {
  margin: 12px 0 0; max-width: 720px; font-size: 18px;
  line-height: 1.65; color: var(--e-global-color-ink);
}
@media (max-width: 767px) {
  .kadima-faq summary { font-size: 18px; }
  .kadima-faq details > p { font-size: 16px; }
}

/* ---------- Editorial measure ---------- */
.kadima-prose { max-width: 720px; }

/* ============================================================ HEADER ============================================================ */
.kadima-header { background: var(--e-global-color-bg); border-bottom: 1px solid var(--e-global-color-border); }
.kadima-header__inner {
  max-width: 1200px; margin: 0 auto; padding: 0 24px; display: flex;
  align-items: center; justify-content: space-between; gap: 24px; min-height: 80px;
}
.kadima-header__logo {
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 24px; font-weight: 600; color: var(--e-global-color-ink); text-decoration: none;
}
.kadima-nav__list, .kadima-nav__sub { list-style: none; margin: 0; padding: 0; }
.kadima-nav__list { display: flex; align-items: center; gap: 28px; }
.kadima-nav__list > li { position: relative; }
.kadima-nav__list a, .kadima-nav__toggle {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 16px; font-weight: 600; color: var(--e-global-color-ink);
  text-decoration: none; display: inline-flex; align-items: center;
  min-height: 44px; cursor: pointer;
}
.kadima-nav__toggle::after {
  content: ""; width: 7px; height: 7px; margin-left: 8px;
  border-right: 2px solid var(--e-global-color-accent);
  border-bottom: 2px solid var(--e-global-color-accent);
  transform: rotate(45deg) translateY(-2px);
}
.kadima-nav__sub {
  position: absolute; top: 100%; left: 0; z-index: 999; min-width: 260px; padding: 8px 0;
  background: var(--e-global-color-surface); border: 1px solid var(--e-global-color-border);
  opacity: 0; visibility: hidden; transition: opacity .15s ease;
}
.kadima-nav__parent:hover > .kadima-nav__sub,
.kadima-nav__parent:focus-within > .kadima-nav__sub { opacity: 1; visibility: visible; }
.kadima-nav__sub a { display: flex; padding: 0 20px; font-weight: 400; width: 100%; }
.kadima-nav__sub a:hover { color: var(--e-global-color-accent-text); }
.kadima-header__actions { display: flex; align-items: center; gap: 20px; }
.kadima-header__phone {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 16px; font-weight: 600; color: var(--e-global-color-ink);
  text-decoration: none; display: inline-flex; align-items: center; min-height: 44px;
}
.kadima-header__cta {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 16px; font-weight: 600; line-height: 1;
  color: var(--e-global-color-bg); background: var(--e-global-color-ink);
  padding: 16px 32px; border-radius: 2px; text-decoration: none;
  display: inline-flex; align-items: center; min-height: 44px;
}
.kadima-header__cta:hover { background: var(--e-global-color-accent-button); }
@media (max-width: 1024px) {
  .kadima-header__inner { flex-wrap: wrap; min-height: 64px; padding: 12px 16px; }
  .kadima-nav { order: 3; width: 100%; }
  .kadima-nav__list { flex-wrap: wrap; gap: 16px; }
  .kadima-nav__sub { position: static; opacity: 1; visibility: visible; border: none; background: transparent; padding: 0 0 0 16px; }
}

/* ============================================================ FOOTER ============================================================ */
.kadima-footer { background: var(--e-global-color-bg); border-top: 1px solid var(--e-global-color-border); padding: 64px 24px 48px; }
.kadima-footer__cta {
  max-width: 1200px; margin: 0 auto 56px; display: flex; flex-wrap: wrap;
  align-items: center; justify-content: center; gap: 20px;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 20px; color: var(--e-global-color-ink);
}
.kadima-footer__cta-button {
  font-size: 16px; font-weight: 600; line-height: 1;
  color: var(--e-global-color-bg); background: var(--e-global-color-ink);
  padding: 16px 32px; border-radius: 2px; text-decoration: none;
  display: inline-flex; align-items: center; min-height: 44px;
}
.kadima-footer__cta-button:hover { background: var(--e-global-color-accent-button); }
.kadima-footer__cta a { color: var(--e-global-color-ink); }
.kadima-footer__columns { max-width: 1200px; margin: 0 auto; display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 40px; }
@media (max-width: 1024px) { .kadima-footer__columns { grid-template-columns: 1fr 1fr; } }
@media (max-width: 767px)  { .kadima-footer__columns { grid-template-columns: 1fr; } }
.kadima-footer__heading {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
  color: var(--e-global-color-accent-text); margin: 0 0 16px;
}
.kadima-footer__col ul { list-style: none; margin: 0; padding: 0; }
.kadima-footer__col li { margin: 0; }
.kadima-footer__col a {
  font-size: 15px; line-height: 1.5; color: var(--e-global-color-ink);
  text-decoration: none; display: inline-flex; align-items: center; min-height: 44px;
}
.kadima-footer__col a:hover { color: var(--e-global-color-accent-text); text-decoration: underline; }
/* LOCKED - Decision 09.4: NAP + licence block is ink, never muted, never below 14px. */
.kadima-footer__nap p { margin: 0 0 6px; font-size: 15px; line-height: 1.5; color: var(--e-global-color-ink); }
.kadima-footer__nap a { color: var(--e-global-color-ink); text-decoration: none; min-height: 0; display: inline; }

/* ============================================================
   Sub-fase 4D: las doce clases de cuerpo de pagina
   Contraste verificado 2026-08-12 (decision-09 seccion 9.3).
   ============================================================ */
.kadima-crumbs {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 13px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; line-height: 1.4;
  color: var(--e-global-color-accent-text); margin: 0 0 4px;
}
.kadima-crumbs a { color: var(--e-global-color-accent-text); text-decoration: none; }
.kadima-crumbs a:hover { text-decoration: underline; }
.kadima-crumbs span[aria-hidden] { opacity: .5; margin: 0 4px; }
.kadima-crumbs > span:last-child { color: var(--e-global-color-muted); }

.kadima-cta-row {
  margin: 4px 0 0;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 20px; font-weight: 600; line-height: 1.3;
}
a.kadima-phone {
  color: var(--e-global-color-ink); text-decoration: none;
  border-bottom: 2px solid var(--e-global-color-accent);
  padding-bottom: 2px; display: inline-block; min-height: 44px;
}
a.kadima-phone:hover { color: var(--e-global-color-accent-text); border-bottom-color: var(--e-global-color-accent-text); }

.kadima-trustbar {
  margin: 0;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px; font-weight: 600; letter-spacing: .02em;
  line-height: 1.5; text-align: center; color: var(--e-global-color-ink);
  display: flex; flex-wrap: wrap; justify-content: center; align-items: center;
}
.kadima-trustbar > span { display: inline-flex; align-items: center; }
.kadima-trustbar > span + span::before {
  content: ""; flex: 0 0 5px; width: 5px; height: 5px; border-radius: 50%;
  background: var(--e-global-color-accent); margin: 0 14px;
}
/* El color invertido va bajo modificador y NO suelto. La barra tiene fondo
   blanco por setting de contenedor en las 26 paginas; poner cream sitewide
   la volveria invisible en las 25 que todavia no tienen el contenedor navy.
   Cada tipo de pagina recibe el modificador en su propio pase de composicion. */
.kadima-trustbar--invert { color: var(--e-global-color-bg); }

/* En mobile los chips rompian en una linea cada uno con el punto colgando al
   inicio. Vertical con filete fino entre items: se lee como lista, no como
   texto roto. */
@media (max-width: 767px) {
  .kadima-trustbar { font-size: 14px; line-height: 1.6; flex-direction: column; }
  .kadima-trustbar > span { width: 100%; justify-content: center; padding: 7px 0; }
  .kadima-trustbar > span + span::before { display: none; }
  .kadima-trustbar > span + span { border-top: 1px solid var(--e-global-color-border); }
  .kadima-trustbar--invert > span + span {
    border-top-color: color-mix(in srgb, var(--e-global-color-bg) 22%, transparent);
  }
}

/* ---------- Los bloques de ancho completo, que no lo eran ----------
   Elementor pone align-items: center en .e-con-inner, asi que un widget de
   bloque se dimensiona por su contenido y no por el contenedor. Medido en
   /bathroom-remodeling/ el 2026-08-14, dentro de una seccion de 1200:

     .kadima-badges        864px   los 3 badges y su filete, cortos
     .kadima-cards         995px   la grilla y su filete bronce, cortos
     .kadima-subservices  1200px   zafaba solo porque su max-content pasa 1200

   Y en la home, con las fotos de las cards en lazy, la grilla media 778px
   antes de que cargaran y 1200 despues: un salto de layout en cada visita.
   Los tres son de ancho completo por definicion, asi que se les fija. */
.e-con-inner > .elementor-widget:has(> .kadima-cards),
.e-con-inner > .elementor-widget:has(> .kadima-subservices),
.e-con-inner > .elementor-widget:has(> .kadima-badges) {
  align-self: stretch;
  width: 100%;
}

/* ---------- 4. Tarjetas de sub-servicio, con filete bronce ---------- */
.kadima-subservices {
  max-width: none; width: 100%; display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px;
  padding-top: 40px; border-top: 3px solid var(--e-global-color-accent);
}
@media (max-width: 767px) { .kadima-subservices { grid-template-columns: 1fr; gap: 20px; padding-top: 28px; } }
.kadima-svc {
  background: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  padding: 32px 28px; display: flex; flex-direction: column;
}
.kadima-svc h3 {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 21px; font-weight: 600; line-height: 1.3;
  color: var(--e-global-color-ink); margin: 0 0 12px;
}
.kadima-svc p { font-size: 17px; line-height: 1.6; color: var(--e-global-color-ink); margin: 0 0 16px; }
.kadima-svc p:last-child { margin-bottom: 0; margin-top: auto; }

.kadima-steps { display: grid; gap: 32px; }
.kadima-step { display: grid; grid-template-columns: 64px 1fr; column-gap: 20px; align-items: start; }
.kadima-step-n {
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 44px; font-weight: 600; line-height: 1;
  color: var(--e-global-color-accent); grid-row: span 2; align-self: start;
}
.kadima-step h3 {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 20px; font-weight: 600; line-height: 1.3;
  color: var(--e-global-color-ink); margin: 6px 0 8px;
}
.kadima-step p { margin: 0; max-width: 62ch; }
@media (max-width: 767px) {
  .kadima-steps { gap: 24px; }
  .kadima-step { grid-template-columns: 44px 1fr; column-gap: 14px; }
  .kadima-step-n { font-size: 32px; }
}

.kadima-badges { width: 100%; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
@media (max-width: 767px) { .kadima-badges { grid-template-columns: 1fr; gap: 14px; } }
.kadima-badge {
  background: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
  padding: 24px 20px; text-align: center; display: flex; flex-direction: column; gap: 6px;
}
.kadima-badge strong {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 16px; font-weight: 600; line-height: 1.35; color: var(--e-global-color-ink);
}
.kadima-badge span { font-size: 15px; line-height: 1.4; color: var(--e-global-color-muted); }

p.kadima-more {
  margin: 20px 0 0;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 16px; font-weight: 600; line-height: 1.4;
}
p.kadima-more a {
  color: var(--e-global-color-accent-text); text-decoration: none;
  display: inline-flex; align-items: center; gap: 8px; min-height: 44px;
}
p.kadima-more a::after {
  content: ""; width: 7px; height: 7px;
  border-right: 2px solid currentColor; border-top: 2px solid currentColor;
  transform: rotate(45deg);
}
p.kadima-more a:hover { text-decoration: underline; }

.kadima-nap p { font-size: 17px; line-height: 1.7; color: var(--e-global-color-ink); margin: 0 0 14px; }
.kadima-nap p:last-child { margin-bottom: 0; }
.kadima-nap a { color: var(--e-global-color-ink); }
.kadima-nap a.kadima-phone { font-size: 20px; border-bottom-width: 2px; min-height: 0; }

/* ============================================================
   Sub-fase 4D: las tres areas libres (decision-09 seccion 9.2)
   Fuente comentada: build/4D-free-areas.css
   ============================================================ */

/* ---------- Area 1: filetes y reglas ---------- */
.kadima-rule {
  display: block; width: 72px; height: 3px;
  margin: 20px 0 0; background: var(--e-global-color-accent);
}
.kadima-cut {
  width: 100%; max-width: 760px; height: 0; margin: 0 auto;
  border-top: 1px solid var(--e-global-color-border);
}
.kadima-open { width: 100%; height: 3px; background: var(--e-global-color-accent); }
.kadima-subservices,
.kadima-badge { border-top-color: var(--e-global-color-accent); }
.kadima-step { position: relative; }
.kadima-step:not(:last-child)::before {
  content: ""; position: absolute; left: 31px; top: 58px; bottom: -32px;
  width: 1px; background: var(--e-global-color-accent); opacity: .45;
}
@media (max-width: 767px) {
  .kadima-step:not(:last-child)::before { left: 21px; top: 42px; bottom: -24px; }
}

/* ---------- Area 2: iconografia, peso de linea 1.5 en viewBox 24.
   Mapeo verificado contra el HTML servido: 1 y 2 licencias, 3 seguro. ---------- */
.kadima-badge::before {
  content: ""; display: block; width: 26px; height: 26px;
  background-color: var(--e-global-color-accent);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
  -webkit-mask-size: contain; mask-size: contain;
  margin: 0 auto 12px;
}
.kadima-badge:nth-child(1)::before,
.kadima-badge:nth-child(2)::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 2.75 4.75 5.5v6.1c0 4.4 3 8.2 7.25 9.65 4.25-1.45 7.25-5.25 7.25-9.65V5.5Z'/%3E%3Cpath d='m8.9 11.9 2.2 2.2 4-4.2'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 2.75 4.75 5.5v6.1c0 4.4 3 8.2 7.25 9.65 4.25-1.45 7.25-5.25 7.25-9.65V5.5Z'/%3E%3Cpath d='m8.9 11.9 2.2 2.2 4-4.2'/%3E%3C/svg%3E");
}
.kadima-badge:nth-child(3)::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.75 12.25a9.25 9.25 0 0 1 18.5 0Z'/%3E%3Cpath d='M12 3v-.9'/%3E%3Cpath d='M12 12.25v6.4a2.35 2.35 0 0 1-4.7 0'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.75 12.25a9.25 9.25 0 0 1 18.5 0Z'/%3E%3Cpath d='M12 3v-.9'/%3E%3Cpath d='M12 12.25v6.4a2.35 2.35 0 0 1-4.7 0'/%3E%3C/svg%3E");
}
@supports not ((-webkit-mask-image: none) or (mask-image: none)) {
  .kadima-badge::before { display: none; }
}

/* ---------- Area 3: hero. El modificador va en el widget, no en el contenedor:
   Elementor no emite _css_classes en un contenedor flex. Verificado 2026-08-13. ---------- */
.kadima-hero-media { overflow: hidden; background: var(--e-global-color-border); }
.kadima-hero-media img { display: block; width: 100%; height: 100%; object-fit: cover; max-width: 100%; }
.kadima-hero-media--band { width: 100%; margin-top: 40px; aspect-ratio: 21 / 9; }
@media (max-width: 900px) { .kadima-hero-media--band { aspect-ratio: 3 / 2; margin-top: 28px; } }
/* La cadena larga no es capricho. Elementor limita el ancho de los widgets con
   .e-con.e-con > .e-con-inner > .elementor-widget { max-width:100% }, que es
   specificity (0,4,0); cualquier cosa mas corta pierde y el frame portrait salia
   a 1200 de ancho por 1600 de alto. Medido el 2026-08-13. */
.e-con.e-con > .e-con-inner > .kadima-hero-media--split {
  width: 100%; max-width: 440px; margin: 40px auto 0; aspect-ratio: 3 / 4;
  border-top: 3px solid var(--e-global-color-accent);
}
@media (max-width: 900px) {
  .e-con.e-con > .e-con-inner > .kadima-hero-media--split {
    max-width: 100%; margin-top: 28px; aspect-ratio: 4 / 3;
  }
}

/* ---------- Hero full-bleed con overlay navy ----------
   Reemplaza al split 50/50 (decision del 2026-08-15). La foto cubre toda la
   seccion, encima va un overlay navy plano y el texto cream a la izquierda.

   El 70% no es estetico, es el piso que garantiza AA sin mirar la foto. Peor
   caso posible, foto blanca pura: el compuesto queda en L=0.1455 y cream
   #FAF8F4 encima da 5.10:1. Al 65% da 4.42 y no llega. Como el peor caso pasa,
   no hace falta subir opacidad por pagina.

   La imagen se posiciona contra el CONTENEDOR, no contra .e-con-inner. Por eso
   el inner queda estatico y son los hijos de texto los que suben con
   position: relative + z-index. Si el inner fuera relative, la foto quedaria
   encajonada en los 1200 del boxed y no seria full-bleed.

   Las reglas de --band y --split siguen en el kit y siguen matcheando estos
   mismos widgets, pero pierden: la cadena de aca es (0,5,0) contra (0,4,0). Por
   eso hay que anular explicitamente aspect-ratio, max-width y margin. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) {
  position: relative;
  /* isolation: isolate NO es decorativo, es lo que evita que esto rompa el menu.
     Elementor emite .e-con { position: var(--position); z-index: var(--z-index) }
     con --z-index: revert, o sea z-index auto. position relative + z-index auto
     NO crea contexto de apilado, asi que el ::before en z-index 1 y los hijos de
     texto en z-index 2 se apilaban en el contexto RAIZ, donde ya vive
     ul.elementor-nav-menu con z-index 2. Empate a 2, desempata orden de DOM, y el
     hero va despues del header: el H1 quedaba por encima del desplegable.
     Medido con elementFromPoint sobre el submenu de Services abierto: 3 de 8
     items dejaban de recibir el click. isolation encierra el 0/1/2 adentro del
     hero sin pisar la perilla --z-index del editor. */
  isolation: isolate;
  overflow: hidden;
  min-height: 620px;
  justify-content: center;
  padding-top: 88px;
  padding-bottom: 88px;
}
/* El overlay es un GRADIENTE, no un plano. Un plano al 70% garantiza AA pero
   convierte cualquier foto en barro: probado, no se veia nada. El gradiente
   mantiene la zona del texto oscura y deja ver la obra a la derecha.
   Medido sobre las 4 fotos de referencia en la caja real del texto
   (x 120..800, y 150..520 a 1440): entre 6.86:1 y 7.32:1 contra cream, o sea
   AA holgado. La meseta llega al 50% del ancho a proposito: con una rampa
   lineal desde 0 el contraste caia a 2.88:1 donde todavia hay texto. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media)::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(100deg,
    rgba(26, 43, 74, .94) 0%,
    rgba(26, 43, 74, .90) 50%,
    rgba(26, 43, 74, .55) 68%,
    rgba(26, 43, 74, .20) 85%,
    rgba(26, 43, 74, .12) 100%);
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) {
  align-items: flex-start;
  gap: 20px;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > * {
  position: relative;
  z-index: 2;
  width: auto;
  max-width: 660px;
  margin: 0;
  text-align: left;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  margin: 0;
  aspect-ratio: auto;
  border: 0;
  overflow: hidden;
}
/* Slider del hero. Sin JS y sin libreria: las imagenes se apilan y rotan con
   una animacion de opacidad escalonada. Con una sola imagen no anima nada.
   Sirve para 2, 3 o 4 imagenes; el ciclo es 8s por imagen. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  opacity: 0;
  animation: kadimaHeroFade 32s linear infinite;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img:nth-child(1) { animation-delay: 0s; }
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img:nth-child(2) { animation-delay: 8s; }
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img:nth-child(3) { animation-delay: 16s; }
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img:nth-child(4) { animation-delay: 24s; }
/* Una sola imagen: se queda fija. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img:only-child {
  opacity: 1;
  animation: none;
}
@keyframes kadimaHeroFade {
  0%   { opacity: 0; }
  3%   { opacity: 1; }
  22%  { opacity: 1; }
  28%  { opacity: 0; }
  100% { opacity: 0; }
}
/* Sin movimiento si el usuario lo pidio: queda la primera, fija. */
@media (prefers-reduced-motion: reduce) {
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img {
    animation: none;
    opacity: 0;
  }
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .kadima-hero-media > img:first-child {
    opacity: 1;
  }
}
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) :is(h1, p, .kadima-crumbs, .kadima-crumbs a, .kadima-crumbs span) {
  color: var(--e-global-color-bg);
}
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .kadima-crumbs a:hover {
  color: var(--e-global-color-bg);
  text-decoration: underline;
}
/* Boton solido cream. La regla sitewide del boton navy es (0,3,0) y esta es
   (0,6,0), asi que gana sin !important. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .elementor-widget-button .elementor-button {
  background-color: var(--e-global-color-bg);
  color: var(--e-global-color-ink);
}
/* El par de estado lleva la cadena ENTERA a proposito. La regla de reposo de
   arriba es (0,6,0) y la de estado sitewide del kit es (0,4,0): con una cadena
   corta, el reposo le gana al boton incluso con el puntero encima y el hover no
   existiria. Con la cadena completa mas la pseudo-clase queda (0,7,0) y gana.
   Y el relleno es border #E5E0D8, no accent: accent con texto ink da 3.75:1 y el
   label del boton es 16px/600, o sea texto normal, umbral 4.5. #E5E0D8 da 10.7:1.
   Accent solo pasa a 19px/700, que es el caso de .kadima-mark-cta, no este. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .elementor-widget-button .elementor-button:hover,
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .elementor-widget-button .elementor-button:focus-visible {
  background-color: var(--e-global-color-border);
  color: var(--e-global-color-ink);
}
/* Boton outline cream: el telefono. Hay que anular el border-bottom bronce que
   trae a.kadima-phone del kit, si no queda un borde de 2 colores. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) a.kadima-phone {
  color: var(--e-global-color-bg);
  border: 2px solid var(--e-global-color-bg);
  border-radius: 2px;
  padding: 0 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 56px;
  font-size: 16px;
  line-height: 1;
}
/* Los dos tienen que medir lo mismo. Sin esto la altura de cada uno sale de su
   propio padding y no del par: medido en las 22 paginas, boton 62px contra
   telefono 46px, y 16px de diferencia entre dos piezas pegadas se lee como un
   error de armado. Se fija la altura en los dos y el padding vertical pasa a 0,
   asi ninguno queda atado al button_padding del kit. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .elementor-widget-button .elementor-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 56px;
  padding-top: 0;
  padding-bottom: 0;
}
/* Idem el telefono: reposo (0,5,1) contra a.kadima-phone:hover del kit (0,2,1).
   Cadena completa, y con el par de foco de teclado que faltaba. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) a.kadima-phone:hover,
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) a.kadima-phone:focus-visible {
  background: var(--e-global-color-bg);
  color: var(--e-global-color-ink);
  border-color: var(--e-global-color-bg);
}
/* El .kadima-cta-row envuelve al telefono en algunas paginas y trae font-size 20
   y margin propio. Aca el tamano lo manda el boton. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .kadima-cta-row {
  margin: 0;
  font-size: 16px;
}
/* ---------- El par de CTA del hero: en fila en desktop, apilado en movil ----------
   Dos formas de markup conviven y las dos tienen que dar el mismo resultado.

   Forma 1, dos paginas (/ y /bathroom-remodeling/): boton y telefono viven en un
   .e-con anidado con content_width full, o sea sin .e-con-inner propio. Un .e-con
   de Elementor es flex COLUMN por defecto, asi que el par salia uno abajo del
   otro aunque tuviera contenedor propio. Faltaba el flex-direction, no el gap. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .e-con {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-start;
  gap: 16px;
  width: auto;
}
/* Forma 2, las otras 20 paginas: no hay contenedor, el boton y el telefono son
   dos hijos sueltos del .e-con-inner, que tambien es flex column. No se envuelven
   en markup nuevo: el inner pasa a fila con wrap, y todo hijo que no sea del par
   se lleva su renglon entero con flex-basis 100%. El par queda con basis auto y,
   por ser adyacentes, comparte renglon.

   La compuerta es :has(> .elementor-widget-button). En las 2 paginas de la forma 1
   el boton no es hijo directo del inner, y en las 4 sin CTA no hay boton: esas 6
   no entran aca y siguen en columna. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-start;
  column-gap: 16px;
  row-gap: 20px;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) > * {
  flex: 0 0 100%;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) > .elementor-widget-button,
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) > .elementor-widget-html:has(a.kadima-phone) {
  flex: 0 0 auto;
}
@media (max-width: 900px) {
  [data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) {
    min-height: 460px;
    padding-top: 64px;
    padding-bottom: 64px;
  }
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > * {
    max-width: 100%;
  }
  /* Movil: el par se apila y los dos botones toman el ancho completo. Las dos
     formas se vuelven a nombrar enteras porque una media query no suma
     especificidad: contra un :has() de base, la rama movil escrita corta pierde.
     Ver la regla de :has() en breakpoints en CLAUDE.md. */
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media) > .e-con {
    flex-direction: column;
    align-items: stretch;
    gap: 16px;
    width: 100%;
  }
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) {
    row-gap: 16px;
  }
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) > .elementor-widget-button,
  [data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) > .elementor-widget-html:has(a.kadima-phone) {
    flex: 0 0 100%;
  }
  /* Boton alargado: ancho completo y label centrado. Los 56px de alto vienen de
     la regla base; aca solo cambia el ancho y sube un punto la tipografia, que a
     ancho completo tiene lugar de sobra. Barra de lado a lado en vez de dos
     etiquetas sueltas, y muy por encima de los 44px de destino tactil. */
  [data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) .elementor-widget-button .elementor-button,
  [data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) a.kadima-phone {
    display: flex;
    width: 100%;
    font-size: 17px;
  }
}

/* ---------- Hero tipografico: las 16 paginas sin foto ----------
   Diagnostico medido en /home-remodeling-scarsdale-ny/ el 2026-08-15, y el
   problema no era el ancho. El contenedor es flex column con align-items:
   center, asi que CADA hijo se dimensiona por su contenido y se centra por su
   cuenta. Los bordes izquierdos medidos eran 547 / 295 / 134 / 642 / 612: cinco
   ejes distintos. Se leia como cinco cosas centradas, no como un hero.

   Por que 860 y no 720: a 720 el H1 pasa de una linea a dos y el hero sube de
   672 a 761px, o sea MAS alto. A 860 el H1 aguanta una linea y, con el padding
   de seccion en 64, el hero baja a 637. Medido, no estimado.

   `width: 100%` en los hijos es lo que unifica el eje. Sin eso, capar el
   contenedor solo angosta a los dos hijos largos y quedan cuatro ejes.

   La compuerta va con :not(:has()) y no con :has() anidado: `:has()` dentro de
   `:has()` es invalido y la regla entera se descarta en silencio. Por eso el
   padding se ataja sobre el contenedor con :not(:has(.kadima-hero-media)) y no
   sobre el contenedor que contiene un inner sin imagen. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:not(:has(> .kadima-hero-media)) {
  max-width: 860px;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:not(:has(> .kadima-hero-media)) > * {
  width: 100%;
  max-width: 100%;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:not(:has(> .kadima-hero-media)) :is(h1, p, nav) {
  text-align: center;
}
/* El boton es hijo directo del widget, no hay .elementor-button-wrapper, y el
   CSS de pagina le pone text-align: start al widget. Hay que nombrar el widget. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:not(:has(> .kadima-hero-media)) > .elementor-widget-button {
  text-align: center;
}
/* La home mete el boton y el telefono en un contenedor anidado, en vez de dos
   widgets sueltos como las otras 15. Es flex, asi que text-align no lo mueve:
   hay que centrarlo con justify-content. Sin esto el par queda 247px a la
   izquierda del eje mientras todo lo de arriba esta centrado. Y el contenedor
   es content_width: full, o sea que NO tiene .e-con-inner: hay que nombrar el
   .e-con directo. Medido en / el 2026-08-15. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:not(:has(> .kadima-hero-media)) > .e-con {
  justify-content: center;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type:not(:has(.kadima-hero-media)) {
  padding-top: 64px;
  padding-bottom: 64px;
}

/* ---------- Desplegables del header ----------
   Elementor los sirve con su panel blanco y su hover gris #3F444B, que no es de
   esta paleta. El panel pasa a navy con texto cream y filo bronce arriba, igual
   que la barra de las tarjetas.

   El hover NO usa bronce como color de texto: #A67C3F sobre #1A2B4A da 3.6:1 y
   el item es de 15px normal, umbral 4.5. Se invierte el par, cream de fondo y
   navy de texto, que da 12.9:1 y es el mismo gesto que el boton del hero.

   Especificidad: widget-nav-menu.min.css pinta el item en (0,2,0) y post-38.css
   en (0,3,0). Nombrar el widget deja estas en (0,4,0) y ganan sin !important. */
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown {
  background-color: var(--e-global-color-ink);
  border-top: 3px solid var(--e-global-color-accent);
  box-shadow: 0 18px 40px rgba(26, 43, 74, .22);
  padding: 6px 0;
  min-width: 210px;
}
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-sub-item,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-item {
  color: var(--e-global-color-bg);
  background-color: transparent;
  padding: 12px 24px;
  font-size: 15px;
  line-height: 1.35;
  border-left: 0;
  border-bottom: 1px solid rgba(250, 248, 244, .10);
}
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown li:last-child > .elementor-sub-item,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown li:last-child > .elementor-item {
  border-bottom: 0;
}
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-sub-item:hover,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-sub-item:focus-visible,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-sub-item.elementor-item-active,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-item:hover,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-item:focus-visible,
.elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-item.elementor-item-active {
  background-color: var(--e-global-color-bg);
  color: var(--e-global-color-ink);
}
/* En movil el panel ocupa el ancho de la barra y no necesita el ancho minimo. */
@media (max-width: 767px) {
  .elementor-location-header .elementor-widget-nav-menu .elementor-nav-menu--dropdown {
    min-width: 0;
    box-shadow: 0 18px 40px rgba(26, 43, 74, .34);
  }
}

/* ---------- Area 3: grid de portfolio, estatico, nunca carousel ---------- */
.kadima-cards {
  width: 100%; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 28px; padding-top: 40px; border-top: 3px solid var(--e-global-color-accent);
}
/* Cuatro cards entran mejor en 2x2 que en 3 + 1 huerfana. La regla cuenta sola,
   asi que no hay que acordarse de poner un modificador en el markup. */
.kadima-cards:has(> .kadima-card:nth-child(4):last-child) {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
@media (max-width: 1024px) { .kadima-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* El :has le gana por specificity a un media query que solo lleve
   .kadima-cards, asi que la fila de 4 hay que nombrarla tambien aca. Sin esto
   las cards salen a 152px de ancho en un telefono. Medido a 390px. */
@media (max-width: 640px)  {
  .kadima-cards,
  .kadima-cards:has(> .kadima-card:nth-child(4):last-child) {
    grid-template-columns: 1fr; gap: 22px; padding-top: 28px;
  }
}
.kadima-card {
  background: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  display: flex; flex-direction: column;
}
.kadima-card figure { margin: 0; aspect-ratio: 4 / 3; overflow: hidden; background: var(--e-global-color-border); }
.kadima-card figure img { display: block; width: 100%; height: 100%; object-fit: cover; max-width: 100%; }
.kadima-card-body { padding: 22px 22px 24px; display: flex; flex-direction: column; gap: 8px; }
.kadima-card h3 {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 19px; font-weight: 600; line-height: 1.3;
  color: var(--e-global-color-ink); margin: 0;
}
.kadima-card p { font-size: 15px; line-height: 1.55; color: var(--e-global-color-muted); margin: 0; }
.kadima-card--ba figure {
  aspect-ratio: 2 / 1; display: grid; grid-template-columns: 1fr 1fr;
  gap: 2px; background: var(--e-global-color-accent);
}
.kadima-card--ba figure img { aspect-ratio: 1 / 1; }
.kadima-card--ba .kadima-card-body::before {
  content: "Before / After";
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 12px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
  color: var(--e-global-color-accent-text);
}
/* .kadima-cards-empty: ESTADO TRANSITORIO hasta que lleguen fotos nuevas de
   proyectos. Reemplazar por .kadima-cards con 3 cards por hub cuando esten
   disponibles. Ver build/photo-audit-and-assignment.md, seccion 8, los 35
   frames pedidos a Hector, y seccion 7, por que hoy no hay ninguna foto libre.

   Por que un mensaje y no un grid en blanco: 4B-status.md seccion 8. Un grid
   vacio se lee como roto; el mensaje se lee como nuevo.
   Por que no repetir aca la foto del hero de la misma pagina: la prueba visual
   ya esta arriba. La misma foto 800px mas abajo con otro label no suma prueba,
   resta credibilidad. En la home se acepto duplicar porque la portada sin
   ninguna obra terminada queda coja; un hub no tiene ese problema. */
.kadima-cards-empty {
  grid-column: 1 / -1; padding: 56px 24px; text-align: center;
  font-size: 17px; line-height: 1.6; color: var(--e-global-color-ink);
  background: var(--e-global-color-surface);
  border: 1px dashed var(--e-global-color-border);
}
.kadima-section--lift { background: var(--e-global-color-surface); }

/* ---------- Area 3 bis: la escala tipografica, que no estaba llegando ----------
   Elementor emite un tamano por cada .elementor-size-*, y los widgets del build
   usan elementor-size-default, que no tiene regla. Caian a inherit, o sea al
   body: TODOS los titulos del sitio renderizaban a 18px. Medido en el DOM
   servido de / el 2026-08-13, no deducido. */
.elementor-widget-heading h1.elementor-heading-title {
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 52px; font-weight: 600; line-height: 1.15;
  color: var(--e-global-color-ink);
}
.elementor-widget-heading h2.elementor-heading-title {
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 38px; font-weight: 600; line-height: 1.2;
  color: var(--e-global-color-ink);
}
/* Constraint 3: Playfair queda en h1 y h2, de h3 para abajo va la sans. */
.elementor-widget-heading h3.elementor-heading-title {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 24px; font-weight: 600; line-height: 1.3;
  color: var(--e-global-color-ink);
}
.elementor-widget-heading h4.elementor-heading-title {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 20px; font-weight: 600; line-height: 1.4;
  color: var(--e-global-color-ink);
}
@media (max-width: 767px) {
  .elementor-widget-heading h1.elementor-heading-title { font-size: 34px; line-height: 1.2; }
  .elementor-widget-heading h2.elementor-heading-title { font-size: 28px; line-height: 1.25; }
  .elementor-widget-heading h3.elementor-heading-title { font-size: 21px; line-height: 1.35; }
  .elementor-widget-heading h4.elementor-heading-title { font-size: 18px; }
}

/* El filete bronce bajo cada H2 de seccion. .kadima-prose > h2 matcheaba 0
   elementos: los H2 son widgets de heading aparte y no viven dentro del prose. */
.elementor-widget-heading h2.elementor-heading-title::after {
  content: ""; display: block;
  width: 40px; height: 3px; margin: 20px auto 0;
  background: var(--e-global-color-accent);
}

/* Ritmo de seccion. .kadima-section nunca se aplico a ningun contenedor, asi que
   la regla de 112px apuntaba al vacio. Va sobre los contenedores de primer nivel
   de la pagina, con la trust bar exceptuada porque es una barra fina. */
[data-elementor-type="wp-page"] > .e-con { padding-top: 96px; padding-bottom: 96px; }
[data-elementor-type="wp-page"] > .e-con:has(.kadima-trustbar) { padding-top: 18px; padding-bottom: 18px; }
@media (max-width: 767px) {
  [data-elementor-type="wp-page"] > .e-con { padding-top: 56px; padding-bottom: 56px; }
}

/* ---------- Constraint 2, seccion 4.2: el CTA primario es navy ----------
   Lleva [data-elementor-type] adelante por una razon concreta: los widgets de
   boton se construyeron referenciando el color global Accent, asi que Elementor
   emite .elementor-widget-button .elementor-button { background: accent } en el
   CSS *de cada pagina*, y post-<id>.css carga DESPUES del kit. Con la misma
   specificity gana la pagina. (0,3,0) lo resuelve sin !important y sin tener que
   editar el widget en las 26. Medido en /bathroom-remodeling/ el 2026-08-13. */
[data-elementor-type] .elementor-widget-button .elementor-button {
  background-color: var(--e-global-color-ink);
  color: var(--e-global-color-bg);
  text-decoration: none;
  border-radius: 2px;
}
[data-elementor-type] .elementor-widget-button .elementor-button:hover,
[data-elementor-type] .elementor-widget-button .elementor-button:focus-visible {
  background-color: var(--e-global-color-accent-button);
  color: var(--e-global-color-bg);
  text-decoration: none;
}

/* ============================================================
   Promovido desde el CSS de pagina de la home, 2026-08-14.
   Todas estas reglas activan solo donde existe el markup que las dispara,
   asi que subirlas no cambia ninguna pagina que no lo tenga. El hero 50/50
   subio tambien, mas arriba, en el pase del service hub: post 92 quedo vacio.
   ============================================================ */

.kadima-card-label {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 12px; font-weight: 600; letter-spacing: .12em;
  text-transform: uppercase; color: var(--e-global-color-accent-text);
}
.kadima-card h4 {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 19px; font-weight: 600; line-height: 1.3;
  color: var(--e-global-color-ink); margin: 0;
}
p.kadima-more--center { text-align: center; margin-top: 32px; }
p.kadima-more--center a { justify-content: center; }

.kadima-svc__icon {
  display: block; width: 32px; height: 32px; margin: 0 0 16px;
  color: var(--e-global-color-accent);
}

.kadima-eyebrow {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 13px; font-weight: 600; letter-spacing: .14em;
  text-transform: uppercase; line-height: 1.4;
  color: var(--e-global-color-accent-text);
  margin: 0 0 4px; text-align: center;
}

/* Alternancia de fondo por marcador: una pagina sin el marcador no cambia. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-area) {
  background: var(--e-global-color-surface);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-cta) {
  background: var(--e-global-color-ink);
}
.e-con:has(.kadima-mark-cta) h2.elementor-heading-title,
.e-con:has(.kadima-mark-cta) .kadima-prose p { color: var(--e-global-color-bg); }
.e-con:has(.kadima-mark-cta) a.kadima-phone {
  color: var(--e-global-color-bg);
  border-bottom-color: var(--e-global-color-accent);
}
/* Medido: #7A5A2D sobre navy da 2.24 y el boton se pierde. El bronce display
   da 3.75 y pasa el 3:1 de componente; con texto navy a 19px bold entra en el
   umbral de texto grande, que tambien es 3:1. A 16px no pasa ninguna. */
.e-con:has(.kadima-mark-cta) .elementor-widget-button .elementor-button {
  background-color: var(--e-global-color-accent);
  color: var(--e-global-color-ink);
  font-size: 19px; font-weight: 700;
  padding: 18px 38px;
}
.e-con:has(.kadima-mark-cta) .elementor-widget-button .elementor-button:hover,
.e-con:has(.kadima-mark-cta) .elementor-widget-button .elementor-button:focus-visible {
  background-color: var(--e-global-color-bg);
  color: var(--e-global-color-ink);
}
/* La banda tenia cuatro ejes de alineacion. Medido en /bathroom-remodeling/ el
   2026-08-16, a 1440: el h2 arrancaba en x450, el parrafo en x368, el boton en
   x602 y el telefono en x368. Es el mismo defecto que tenia el hero tipografico:
   el contenedor es flex column con align-items: center, asi que cada hijo se
   dimensiona por su propio contenido y se centra por su cuenta. Se leia como
   cuatro cosas centradas por separado, no como una banda.

   `width: 100%` en los hijos es lo que unifica el eje; el max-width evita que la
   linea de texto se estire a los 1200 del contenedor y se vuelva ilegible. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-cta) > .e-con-inner {
  align-items: center;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-cta) > .e-con-inner > * {
  width: 100%;
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}
.e-con:has(.kadima-mark-cta) .kadima-prose,
.e-con:has(.kadima-mark-cta) .kadima-prose p,
.e-con:has(.kadima-mark-cta) p.kadima-cta-row {
  text-align: center;
  max-width: 100%;
}
/* El boton es hijo directo del widget, no hay wrapper, y el CSS de pagina le pone
   text-align: start al widget. Hay que nombrar el widget, igual que en el hero. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-cta) > .e-con-inner > .elementor-widget-button {
  text-align: center;
}


/* ============================================================
   ANEXO 4F. Composicion del cuerpo, 2026-08-16.
   Todo lo de aca abajo activa solo donde existe el markup que lo dispara,
   asi que una pagina sin recomponer no cambia.
   ============================================================ */
/* ============================================================
   ANEXO 4F - COMPOSICION DEL CUERPO. Once componentes.
   Se agrega AL FINAL de build/elementor-kit-custom.css y se manda dentro
   del objeto COMPLETO del kit (post 5) en una sola llamada.
   Ningun bloque de aca abajo redefine una regla que ya exista en el
   archivo; los cuatro overrides deliberados van marcados como OVERRIDE.
   ============================================================ */

/* ---------- 4F.0 Tokens derivados ----------
   Los tres son mezclas y no se pueden expresar con una var sola, asi que
   el literal va primero como base y el @supports lo reemplaza por la
   mezcla real del token en cuanto el navegador soporta color-mix.
   Los literales son el valor exacto de ink y accent, no aproximaciones. */
:root {
  --k-gap: 24px;
  --k-box: #FFFFFF;              /* fondo de caja en seccion cream */
  --k-tint: #F8F5F0;             /* accent 8% sobre blanco */
  --k-veil: rgba(26, 43, 74, .78);
}
@supports (color: color-mix(in srgb, red 50%, white)) {
  :root {
    --k-box: var(--e-global-color-surface);
    --k-tint: color-mix(in srgb, var(--e-global-color-accent) 8%, var(--e-global-color-surface));
    --k-veil: color-mix(in srgb, var(--e-global-color-ink) 78%, transparent);
  }
}

/* ---------- 4F.1 Ritmo. Un marcador, una regla ----------
   El compositor emite <span class="kadima-tone--surface" hidden> solo cuando
   la seccion toca blanco. Cream es el fondo de pagina, o sea que no necesita
   marcador. --k-box invierte el fondo de TODA caja del sistema, asi que una
   caja nunca queda del mismo color que su seccion.
   (0,3,0), igual que :has(.kadima-mark-area) de la linea 878; este bloque va
   despues en el archivo, asi que gana el empate. Es intencional: las 9
   secciones con mark-area pasan a banda a sangre. */
.kadima-tone--surface { display: none; }
[data-elementor-type="wp-page"] > .e-con:has(.kadima-tone--surface) {
  background: var(--e-global-color-surface);
  --k-box: var(--e-global-color-bg);
}
/* OVERRIDE 1 a 4: las cuatro cajas que hoy tienen el blanco cableado pasan a
   seguir el tono de su seccion. Misma specificity, gana el orden de archivo. */
.kadima-card { background: var(--k-box); }
.kadima-svc { background: var(--k-box); }
.kadima-badge { background: var(--k-box); }
.kadima-cards-empty { background: var(--k-box); }

/* ---------- 4F.2 Base compartida ---------- */
.kadima-ico {
  display: block; flex: 0 0 24px;
  width: 24px; height: 24px;
  color: var(--e-global-color-accent);
}
/* Elementor centra los hijos de .e-con-inner, asi que un widget de bloque se
   dimensiona por su contenido. Misma cadena que ya usan cards, subservices y
   badges en la linea 206. Ninguna media query pisa estas dos propiedades. */
.e-con-inner > .elementor-widget:has(> .kadima-claims),
.e-con-inner > .elementor-widget:has(> .kadima-vs),
.e-con-inner > .elementor-widget:has(> .kadima-spec),
.e-con-inner > .elementor-widget:has(> .kadima-splitband),
.e-con-inner > .elementor-widget:has(> .kadima-linkrows-wrap),
.e-con-inner > .elementor-widget:has(> .kadima-callout),
.e-con-inner > .elementor-widget:has(> .kadima-longform),
.e-con-inner > .elementor-widget:has(> .kadima-icons),
.e-con-inner > .elementor-widget:has(> .kadima-bandmedia) {
  align-self: stretch; width: 100%;
}
/* .kadima-prose fija 720px (linea 44). La cadena doble mide (0,2,0) y gana sin
   depender del orden del archivo. */
.kadima-prose.kadima-claims, .kadima-prose.kadima-vs, .kadima-prose.kadima-spec,
.kadima-prose.kadima-splitband, .kadima-prose.kadima-linkrows-wrap,
.kadima-prose.kadima-callout, .kadima-prose.kadima-longform {
  max-width: none; width: 100%;
}
/* Dato verificable dentro de cualquier parrafo. El texto va en bronce oscuro
   (5.21 sobre blanco, 4.91 sobre cream, ambos AA de texto normal) y el
   subrayado en bronce display, que es objeto grafico y solo necesita 3:1. */
.kadima-key {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-weight: 600; font-variant-numeric: tabular-nums;
  color: var(--e-global-color-accent-text);
  box-shadow: inset 0 -2px 0 0 var(--e-global-color-accent);
}
/* Sobre navy el bronce oscuro da 2.71 y no sirve: ahi el dato va en cream. */
.kadima-lf__lead .kadima-key,
.e-con:has(.kadima-bandmedia) .kadima-key { color: var(--e-global-color-bg); }

/* ---------- 4F.3 kadima-claims: grilla de tarjetas con lamina ----------
   25 secciones. Cada <strong> que abria un parrafo pasa a ser el titulo de una
   tarjeta. La lamina de la izquierda es un item normal de grilla con la imagen
   fuera de flujo: un <img> con alto intrinseco dentro de un item de grilla
   aporta ese alto al dimensionado de la pista y estira el bloque, y
   min-height: 0 no lo arregla. */
.kadima-claims {
  display: grid; grid-template-columns: 360px minmax(0, 1fr); gap: 32px;
  align-items: stretch;
}
.kadima-claims__plate {
  position: relative; margin: 0; min-height: 340px;
  overflow: hidden; background: var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
}
.kadima-claims__plate > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
.kadima-claims__list {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--k-gap);
  align-content: start;
}
.kadima-claims__list > p { grid-column: 1 / -1; margin: 0; max-width: 74ch; }
.kadima-claims__list > p:not(.kadima-more) {
  font-size: 18px; line-height: 1.65; color: var(--e-global-color-muted);
}
.kadima-claim {
  display: grid; grid-template-columns: 24px minmax(0, 1fr);
  column-gap: 14px; row-gap: 8px; align-content: start;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-left: 4px solid var(--e-global-color-ink);
  padding: 24px 24px 26px 20px;
  transition: border-left-color .18s ease, transform .18s ease;
}
.kadima-claim:hover { border-left-color: var(--e-global-color-accent-text); transform: translateY(-2px); }
.kadima-claim > .kadima-ico { grid-row: 1 / span 2; align-self: start; margin-top: 2px; }
.kadima-claim__t {
  grid-column: 2; margin: 0;
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 19px; font-weight: 600; line-height: 1.35;
  color: var(--e-global-color-ink);
}
.kadima-claim__b {
  grid-column: 2; margin: 0; max-width: 58ch;
  font-size: 17px; line-height: 1.62; color: var(--e-global-color-muted);
}
/* Modo corrido: el <strong> no venia seguido de espacio, asi que el parrafo no
   se parte y el strong se destaca en linea. Cero riesgo de texto. */
.kadima-claim--run > .kadima-ico { grid-row: 1; }
.kadima-claim--run .kadima-claim__b { color: var(--e-global-color-ink); }
.kadima-claim--run .kadima-claim__b > strong {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 19px; font-weight: 600; color: var(--e-global-color-ink);
}
/* Impar y ultima cruza las dos columnas: nunca queda un hueco. */
.kadima-claims__list > .kadima-claim:nth-of-type(odd):last-of-type { grid-column: 1 / -1; }
@media (prefers-reduced-motion: reduce) {
  .kadima-claim { transition: none; }
  .kadima-claim:hover { transform: none; }
}
@media (max-width: 1024px) {
  .kadima-claims { grid-template-columns: minmax(0, 1fr); gap: 24px; }
  .kadima-claims__plate { min-height: 0; aspect-ratio: 21 / 9; }
}
@media (max-width: 767px) {
  .kadima-claims__list,
  .kadima-claims__list:has(> .kadima-claim:nth-of-type(odd):last-of-type) {
    grid-template-columns: minmax(0, 1fr); gap: 16px;
  }
  .kadima-claims__list > .kadima-claim:nth-of-type(odd):last-of-type { grid-column: auto; }
  .kadima-claim { padding: 20px 20px 22px 16px; }
  .kadima-claim__t { font-size: 18px; }
  .kadima-claim__b { font-size: 16px; }
}

/* ---------- 4F.4 kadima-vs: dos paneles enfrentados ----------
   10 secciones que el copy ya escribe como una comparacion de dos cosas. */
.kadima-vs { display: grid; gap: var(--k-gap); }
.kadima-vs > p { margin: 0; max-width: 74ch; font-size: 19px; line-height: 1.65; color: var(--e-global-color-muted); }
.kadima-vs > p.kadima-more { max-width: none; margin: 0; }
.kadima-vs__pair {
  display: grid; grid-template-columns: minmax(0, 1fr) 40px minmax(0, 1fr);
  align-items: stretch;
}
.kadima-vs__side {
  display: grid; grid-template-columns: 24px minmax(0, 1fr);
  column-gap: 14px; row-gap: 10px; align-content: start;
  padding: 32px 32px 34px;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-top: 4px solid var(--e-global-color-accent);
}
.kadima-vs__side > .kadima-ico { grid-row: 1 / span 2; align-self: start; margin-top: 2px; }
.kadima-vs__media {
  grid-column: 1 / -1; position: relative; margin: 0 0 6px;
  aspect-ratio: 16 / 10; overflow: hidden; background: var(--e-global-color-border);
}
.kadima-vs__media > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
.kadima-vs__side:has(> .kadima-vs__media) > .kadima-ico { grid-row: 2 / span 2; }
.kadima-vs__t {
  grid-column: 2; margin: 0;
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 20px; font-weight: 600; line-height: 1.32; color: var(--e-global-color-ink);
}
.kadima-vs__b { grid-column: 2; margin: 0; max-width: 52ch; font-size: 17px; line-height: 1.62; color: var(--e-global-color-muted); }
.kadima-vs__side--run > .kadima-ico { grid-row: 1; }
.kadima-vs__side--run .kadima-vs__b { color: var(--e-global-color-ink); }
.kadima-vs__side--run .kadima-vs__b > strong {
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 20px; font-weight: 600; color: var(--e-global-color-ink);
}
.kadima-vs__split { position: relative; }
.kadima-vs__split::before {
  content: ""; position: absolute; left: 50%; top: 16px; bottom: 16px;
  width: 1px; background: var(--e-global-color-accent); transform: translateX(-.5px);
}
.kadima-vs__split::after {
  content: ""; position: absolute; left: 50%; top: 50%; width: 10px; height: 10px;
  background: var(--e-global-color-accent); transform: translate(-50%, -50%) rotate(45deg);
}
/* --rule: sin foto, plano navy con el icono grande. Se usa cuando la
   comparacion es de procedimiento y no hay nada que fotografiar. */
.kadima-vs--rule .kadima-vs__side { border-top-width: 4px; }
.kadima-vs--rule .kadima-vs__side > .kadima-ico { width: 34px; height: 34px; flex-basis: 34px; }
/* --stack: desempate cuando dos kadima-vs caen seguidas en la misma pagina. */
.kadima-vs--stack .kadima-vs__pair { grid-template-columns: minmax(0, 1fr); }
.kadima-vs--stack .kadima-vs__split { height: 40px; }
.kadima-vs--stack .kadima-vs__split::before {
  left: 16px; right: 16px; top: 50%; bottom: auto; width: auto; height: 1px; transform: none;
}
@media (max-width: 900px) {
  .kadima-vs__pair,
  .kadima-vs--stack .kadima-vs__pair { grid-template-columns: minmax(0, 1fr); }
  .kadima-vs__split,
  .kadima-vs--stack .kadima-vs__split { height: 40px; }
  .kadima-vs__split::before,
  .kadima-vs--stack .kadima-vs__split::before {
    left: 16px; right: 16px; top: 50%; bottom: auto; width: auto; height: 1px; transform: none;
  }
  .kadima-vs__side { padding: 26px 22px 28px; }
}
@media (max-width: 767px) {
  .kadima-vs > p { font-size: 17px; }
  .kadima-vs__t { font-size: 18px; }
  .kadima-vs__b { font-size: 16px; }
}

/* ---------- 4F.5 kadima-spec: hoja de datos ----------
   13 secciones con direcciones, telefonos, numeros de licencia y cifras. */
.kadima-spec {
  display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 32px; align-items: stretch;
}
.kadima-spec__plate {
  position: relative; margin: 0; min-height: 300px;
  overflow: hidden; background: var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
}
.kadima-spec__plate > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
.kadima-spec__list {
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
  align-self: start;
}
.kadima-spec__row {
  display: grid; grid-template-columns: 24px minmax(0, 1fr); column-gap: 16px;
  align-items: start; padding: 20px 26px;
  border-bottom: 1px solid var(--e-global-color-border);
}
.kadima-spec__row:last-child { border-bottom: 0; }
/* La fila que abre la hoja es la del dato de la autoridad. Se marca con un
   canto bronce y no con un fondo: sobre una hoja cream un tinte de 5% no se
   distingue, y el canto pasa el 3:1 de objeto grafico sobre los dos fondos. */
.kadima-spec__row:first-child { box-shadow: inset 3px 0 0 0 var(--e-global-color-accent); }
.kadima-spec__row > .kadima-ico { margin-top: 3px; color: var(--e-global-color-accent-text); }
.kadima-spec__row > p {
  margin: 0; max-width: 72ch; font-size: 17px; line-height: 1.68;
  color: var(--e-global-color-ink);
}
.kadima-spec__list > p.kadima-more { margin: 0; padding: 4px 26px 18px; }
@media (max-width: 1024px) {
  .kadima-spec { grid-template-columns: minmax(0, 1fr); gap: 24px; }
  .kadima-spec__plate { min-height: 0; aspect-ratio: 21 / 9; }
}
@media (max-width: 767px) {
  .kadima-spec__row { grid-template-columns: 22px minmax(0, 1fr); column-gap: 12px; padding: 16px 18px; }
  .kadima-spec__row > .kadima-ico { width: 22px; height: 22px; flex-basis: 22px; }
  .kadima-spec__row > p { font-size: 16px; }
  .kadima-spec__list > p.kadima-more { padding: 4px 18px 14px; }
}

/* ---------- 4F.6 kadima-splitband: banda de imagen con panel montado ----------
   15 secciones de prosa narrativa larga, el peor caso del sitio. */
.kadima-splitband {
  display: grid; grid-template-columns: minmax(0, 46fr) minmax(0, 54fr); align-items: center;
}
.kadima-sb__media {
  position: relative; margin: 0; aspect-ratio: 4 / 5;
  overflow: hidden; background: var(--e-global-color-border);
}
.kadima-sb__media > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
.kadima-sb__body {
  position: relative; z-index: 1; margin-left: -56px; padding: 40px 44px;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-left: 4px solid var(--e-global-color-accent);
}
.kadima-sb__body > p {
  margin: 0 0 16px; max-width: 62ch; font-size: 17px; line-height: 1.7;
  color: var(--e-global-color-ink);
}
.kadima-sb__body > p:last-child { margin-bottom: 0; }
.kadima-sb__body > p:first-child { font-size: 20px; line-height: 1.6; }
.kadima-sb__body > p.kadima-more { font-size: 16px; }
.kadima-splitband--flip .kadima-sb__media { order: 2; }
.kadima-splitband--flip .kadima-sb__body {
  order: 1; margin-left: 0; margin-right: -56px;
  border-left: 1px solid var(--e-global-color-border);
  border-right: 4px solid var(--e-global-color-accent);
}
@media (max-width: 1024px) {
  .kadima-sb__body { margin-left: -32px; padding: 32px 30px; }
  .kadima-splitband--flip .kadima-sb__body { margin-left: 0; margin-right: -32px; }
}
@media (max-width: 900px) {
  .kadima-splitband { grid-template-columns: minmax(0, 1fr); }
  .kadima-sb__media, .kadima-splitband--flip .kadima-sb__media { order: 1; aspect-ratio: 16 / 10; }
  .kadima-sb__body, .kadima-splitband--flip .kadima-sb__body {
    order: 2; margin: -40px 20px 0; padding: 30px 26px;
    border-left: 4px solid var(--e-global-color-accent);
    border-right: 1px solid var(--e-global-color-border);
  }
}
@media (max-width: 640px) {
  .kadima-sb__body, .kadima-splitband--flip .kadima-sb__body { margin: -24px 12px 0; padding: 24px 20px; }
  .kadima-sb__body > p { font-size: 16px; }
  .kadima-sb__body > p:first-child { font-size: 18px; }
}

/* ---------- 4F.7 kadima-linkrows: filas de servicio con icono ----------
   9 secciones. El <li> entero se conserva: las comas y los descriptores que
   separan los enlaces son texto visible y no se pueden despiezar. */
ul.kadima-linkrows {
  list-style: none; margin: 0; padding: 0; display: grid; gap: 14px;
}
ul.kadima-linkrows > li {
  display: grid; grid-template-columns: 24px minmax(0, 1fr); column-gap: 16px; align-items: start;
  margin: 0; padding: 20px 24px;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-left: 3px solid var(--e-global-color-accent);
  font-size: 17px; line-height: 1.6; color: var(--e-global-color-muted);
}
ul.kadima-linkrows > li > .kadima-ico { margin-top: 2px; color: var(--e-global-color-accent-text); }
ul.kadima-linkrows a {
  color: var(--e-global-color-ink); font-weight: 600; text-decoration: underline;
  text-decoration-color: var(--e-global-color-accent);
  text-decoration-thickness: 2px; text-underline-offset: 3px;
}
ul.kadima-linkrows a:hover, ul.kadima-linkrows a:focus-visible {
  color: var(--e-global-color-accent-text); text-decoration-color: var(--e-global-color-accent-text);
}
.kadima-linkrows-wrap > p:not(.kadima-more) {
  margin: 18px 0 0; max-width: 72ch; font-size: 17px; line-height: 1.65;
  color: var(--e-global-color-muted);
}
/* --tiles: desempate cuando dos linkrows caen seguidas. */
ul.kadima-linkrows--tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
ul.kadima-linkrows--tiles > li {
  grid-template-columns: minmax(0, 1fr); row-gap: 12px;
  border-left: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
  padding: 24px;
}
@media (max-width: 767px) {
  ul.kadima-linkrows, ul.kadima-linkrows--tiles { grid-template-columns: minmax(0, 1fr); gap: 12px; }
  ul.kadima-linkrows > li { grid-template-columns: 22px minmax(0, 1fr); column-gap: 12px; padding: 16px 16px; font-size: 16px; }
  ul.kadima-linkrows--tiles > li { grid-template-columns: minmax(0, 1fr); }
  ul.kadima-linkrows > li > .kadima-ico { width: 22px; height: 22px; flex-basis: 22px; }
}

/* ---------- 4F.8 kadima-callout: nota destacada ----------
   5 secciones de un solo parrafo, hoy una frase suelta en medio de la pagina. */
.kadima-callout {
  display: grid; grid-template-columns: 72px minmax(0, 1fr); align-items: stretch;
  background: var(--k-tint);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
}
.kadima-callout__i {
  display: grid; place-items: center;
  border-right: 1px solid var(--e-global-color-border);
}
.kadima-callout__i .kadima-ico { width: 30px; height: 30px; flex-basis: 30px; color: var(--e-global-color-accent-text); }
.kadima-callout__b { padding: 28px 32px 30px; }
.kadima-callout__b > p {
  margin: 0 0 14px; max-width: 70ch; font-size: 19px; line-height: 1.66;
  color: var(--e-global-color-ink);
}
.kadima-callout__b > p:last-child { margin-bottom: 0; }
.kadima-callout__media {
  grid-column: 1 / -1; position: relative; margin: 0;
  aspect-ratio: 21 / 9; overflow: hidden; background: var(--e-global-color-border);
}
.kadima-callout__media > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
@media (max-width: 767px) {
  .kadima-callout { grid-template-columns: minmax(0, 1fr); }
  .kadima-callout__i {
    border-right: 0; border-bottom: 1px solid var(--e-global-color-border);
    justify-items: start; padding: 16px 20px;
  }
  .kadima-callout__b { padding: 22px 20px 24px; }
  .kadima-callout__b > p { font-size: 17px; }
}

/* ---------- 4F.9 kadima-longform: entradilla navy mas bloques ----------
   6 secciones largas con subtitulos propios o narrativa en posicion par. */
.kadima-longform { display: grid; gap: var(--k-gap); }
.kadima-lf__lead {
  margin: 0; padding: 30px 34px;
  background: var(--e-global-color-ink);
  border-left: 4px solid var(--e-global-color-accent);
}
.kadima-lf__lead > p {
  margin: 0 0 14px; max-width: 68ch; font-size: 20px; line-height: 1.6;
  color: var(--e-global-color-bg);
}
.kadima-lf__lead > p:last-child { margin-bottom: 0; }
.kadima-lf__lead > p > strong { color: var(--e-global-color-surface); }
.kadima-lf__grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--k-gap);
  grid-auto-flow: row dense;
}
.kadima-lf__block {
  display: grid; grid-template-columns: 24px minmax(0, 1fr);
  column-gap: 16px; row-gap: 10px; align-content: start;
  padding: 26px 28px 28px;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
}
.kadima-lf__block > .kadima-ico { grid-column: 1; grid-row: 1; align-self: start; margin-top: 3px; }
.kadima-lf__block > h3 {
  grid-column: 2; margin: 0;
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 20px; font-weight: 600; line-height: 1.3; color: var(--e-global-color-ink);
}
.kadima-lf__block > p {
  grid-column: 2; margin: 0; max-width: 58ch;
  font-size: 17px; line-height: 1.65; color: var(--e-global-color-muted);
}
.kadima-lf__block > ul { grid-column: 2; margin: 0; padding-left: 20px; }
.kadima-lf__block > ul > li {
  margin: 0 0 10px; font-size: 17px; line-height: 1.62; color: var(--e-global-color-muted);
}
.kadima-lf__block > ul > li:last-child { margin-bottom: 0; }
.kadima-lf__block > p > strong, .kadima-lf__block > ul > li strong { color: var(--e-global-color-ink); }
/* Un bloque con lista cruza el ancho; con dense el hueco lo llena el siguiente. */
.kadima-lf__block:has(> ul) { grid-column: 1 / -1; }
.kadima-lf__grid > .kadima-lf__block:nth-of-type(odd):last-of-type { grid-column: 1 / -1; }
.kadima-longform > p.kadima-more { margin: 0; }
@media (max-width: 900px) {
  .kadima-lf__grid { grid-template-columns: minmax(0, 1fr); }
  .kadima-lf__block:has(> ul),
  .kadima-lf__grid > .kadima-lf__block:nth-of-type(odd):last-of-type { grid-column: auto; }
  .kadima-lf__lead { padding: 24px 22px; }
  .kadima-lf__lead > p { font-size: 18px; }
}
@media (max-width: 767px) {
  .kadima-lf__block { grid-template-columns: 22px minmax(0, 1fr); column-gap: 12px; padding: 22px 20px 24px; }
  .kadima-lf__block > .kadima-ico { width: 22px; height: 22px; flex-basis: 22px; }
  .kadima-lf__block > p, .kadima-lf__block > ul > li { font-size: 16px; }
}

/* ---------- 4F.10 kadima-bandmedia: banda a sangre con foto ----------
   9 secciones de cobertura. Es la unica pieza del cuerpo con texto sobre foto,
   y por eso el velo es plano y medido: navy al 78% sobre el peor caso posible,
   una foto blanca pura, compone #4C5A72, donde cream da 6.57 y el borde 5.31.
   Al 65% cream cae a 4.38 y deja de pasar, o sea que 78 no es estetica. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-bandmedia) {
  position: relative; isolation: isolate; overflow: hidden;
  background: var(--e-global-color-ink);
  padding-top: 104px; padding-bottom: 104px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-bandmedia)::before {
  content: ""; position: absolute; inset: 0; z-index: 1; background: var(--k-veil);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-bandmedia) > .e-con-inner {
  position: static; align-items: center;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-bandmedia) > .e-con-inner > * {
  position: relative; z-index: 2;
  width: 100%; max-width: 760px; margin-left: auto; margin-right: auto; text-align: center;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-bandmedia) > .e-con-inner > .elementor-widget:has(> .kadima-bandmedia) {
  position: absolute; inset: 0; z-index: 0; width: 100%; max-width: none; margin: 0;
}
.kadima-bandmedia { display: block; width: 100%; height: 100%; }
.kadima-bandmedia > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
.e-con:has(.kadima-bandmedia) h2.elementor-heading-title,
.e-con:has(.kadima-bandmedia) .kadima-prose,
.e-con:has(.kadima-bandmedia) .kadima-prose p { color: var(--e-global-color-bg); }
.e-con:has(.kadima-bandmedia) .kadima-prose { max-width: 100%; text-align: center; }
.e-con:has(.kadima-bandmedia) .kadima-prose p { font-size: 21px; line-height: 1.6; }
/* Sobre el velo el bronce da 1.85 y desaparece: filete, enlace y telefono pasan
   a cream, que da 6.57. El telefono lleva su propia regla porque a.kadima-phone
   fija ink en la linea 156 con (0,1,1) y le gana a la herencia del parrafo. */
.e-con:has(.kadima-bandmedia) h2.elementor-heading-title::after { background: var(--e-global-color-bg); }
.e-con:has(.kadima-bandmedia) p.kadima-more a { color: var(--e-global-color-bg); }
.e-con:has(.kadima-bandmedia) p.kadima-more a:hover,
.e-con:has(.kadima-bandmedia) p.kadima-more a:focus-visible { color: var(--e-global-color-surface); text-decoration: underline; }
.e-con:has(.kadima-bandmedia) a.kadima-phone {
  color: var(--e-global-color-bg); border-bottom-color: var(--e-global-color-bg);
}
/* Una media query no suma specificity: la cadena de (0,3,0) va entera aca
   abajo o la rama movil nunca aplica. */
@media (max-width: 767px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-bandmedia) {
    padding-top: 64px; padding-bottom: 64px;
  }
  .e-con:has(.kadima-bandmedia) .kadima-prose p { font-size: 17px; }
}

/* ---------- 4F.11 kadima-icons: la barra de confianza como fila de iconos ----------
   20 secciones. El separador literal se conserva en el markup y se oculta por
   CSS, asi que la linea base de texto no cambia ni un caracter. */
ul.kadima-icons {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0; margin: 0; padding: 0; list-style: none; width: 100%;
}
ul.kadima-icons > li {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  margin: 0; padding: 10px 16px;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px; font-weight: 600; letter-spacing: .02em; line-height: 1.45;
  color: var(--e-global-color-ink);
}
ul.kadima-icons > li + li { border-left: 1px solid var(--e-global-color-border); }
ul.kadima-icons .kadima-ico { width: 22px; height: 22px; flex-basis: 22px; }
.kadima-icons__sep { display: none; }
ul.kadima-icons--invert > li { color: var(--e-global-color-bg); }
ul.kadima-icons--invert > li + li { border-left-color: var(--e-global-color-accent); }
/* La barra conserva su ritmo fino de 18px: al perder la clase kadima-trustbar
   la seccion volveria a los 96px de la linea 821. (0,3,0) gana en todo ancho. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-icons) {
  padding-top: 18px; padding-bottom: 18px;
}
@media (max-width: 900px) {
  ul.kadima-icons { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 4px; }
  ul.kadima-icons > li { justify-content: flex-start; padding: 8px 12px; }
  ul.kadima-icons > li + li, ul.kadima-icons--invert > li + li { border-left: 0; }
}
@media (max-width: 480px) {
  ul.kadima-icons { grid-template-columns: minmax(0, 1fr); }
  ul.kadima-icons > li { font-size: 14px; }
}

/* ---------- 4F.12 kadima-facts: los sellos, con el numero promovido ----------
   10 secciones. Hoy la etiqueta manda y el numero, que es el unico dato que
   alguien copia y verifica, va chico y gris. Se invierte, sin tocar texto. */
.kadima-badges.kadima-facts { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.kadima-facts .kadima-badge {
  display: grid; grid-template-columns: 30px minmax(0, 1fr);
  column-gap: 14px; row-gap: 6px; align-content: start;
  text-align: left; padding: 24px 22px 26px;
  border-top-width: 4px;
}
.kadima-facts .kadima-badge::before { display: none; }
.kadima-facts .kadima-badge > .kadima-ico {
  grid-row: 1 / span 2; align-self: start;
  width: 30px; height: 30px; flex-basis: 30px; color: var(--e-global-color-accent-text);
}
.kadima-facts .kadima-badge strong {
  grid-column: 2; font-size: 13px; letter-spacing: .12em; text-transform: uppercase;
  line-height: 1.4; color: var(--e-global-color-muted);
}
/* 2026-08-27, 4S.5. Dos cambios sobre esta regla.

   1. El valor iba en la tipografia primary, o sea Playfair Display, como
      numero de display. Se pidio que fuera Inter, consistente con el resto de
      los datos duros del sitio: la banda kadima-cert de arriba ya muestra los
      mismos dos numeros de licencia en Inter, asi que la misma pagina los
      mostraba con dos tipografias distintas. Pasa a accent (Inter) y conserva
      el cuerpo de 25px y el peso 600, que es lo que lo promueve.

   2. La regla del tercer sello se cambia de :nth-child(3) a
      :has(> strong.kadima-key), o sea por contenido y no por posicion. El
      comentario viejo advertia que "el orden de los tres sellos es parte del
      contrato", y ese contrato se estaba rompiendo: en las paginas de
      servicio el compositor mete un <span class="kadima-tone--surface" hidden>
      como primer hijo de .kadima-badges, que no se ve pero SI cuenta para
      nth-child. Eso corre todo en uno, asi que el nth-child(3) caia sobre el
      SEGUNDO sello. Medido en /bathroom-remodeling/: el numero
      #2132-535-DCWP salia en serif, el #WC-39446-H20-25 en Inter chico de
      etiqueta, y "Licensed & Insured", que es la etiqueta de verdad, salia en
      serif a 25px. El sello etiqueta es el unico que lleva strong.kadima-key,
      asi que identificarlo por eso es inmune al marcador y a cualquier
      reordenamiento futuro. */
.kadima-facts .kadima-badge span {
  grid-column: 2;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 25px; font-weight: 600; line-height: 1.2;
  color: var(--e-global-color-accent-text); overflow-wrap: anywhere;
}
.kadima-facts .kadima-badge:has(> strong.kadima-key) span {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 16px; font-weight: 500; color: var(--e-global-color-muted);
}
@media (max-width: 1024px) { .kadima-facts .kadima-badge span { font-size: 21px; } }
/* La rama movil de .kadima-badges de la linea 253 mide (0,1,0) y perderia
   contra el (0,2,0) de arriba: se vuelve a nombrar entera. */
@media (max-width: 767px) {
  .kadima-badges.kadima-facts { grid-template-columns: minmax(0, 1fr); gap: 14px; }
  .kadima-facts .kadima-badge { padding: 20px 18px 22px; }
  .kadima-facts .kadima-badge span { font-size: 21px; }
}

/* ---------- 4F.13 kadima-subservices--plate: 3 columnas con icono ----------
   13 secciones, 61 tarjetas. La clase .kadima-svc__icon ya existe en el kit
   (linea 867) y hoy la usa una sola pagina. */
.kadima-subservices.kadima-subservices--plate {
  grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px;
}
/* Cuatro tarjetas entran mejor en 2x2 que en 3 mas una huerfana, igual que
   .kadima-cards de la linea 720. */
.kadima-subservices--plate:has(> .kadima-svc:nth-child(4):last-child) {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
.kadima-svc--plate > .kadima-svc__icon { color: var(--e-global-color-accent); }
@media (max-width: 1024px) {
  .kadima-subservices.kadima-subservices--plate,
  .kadima-subservices--plate:has(> .kadima-svc:nth-child(4):last-child) {
    grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px;
  }
}
@media (max-width: 767px) {
  .kadima-subservices.kadima-subservices--plate,
  .kadima-subservices--plate:has(> .kadima-svc:nth-child(4):last-child) {
    grid-template-columns: minmax(0, 1fr); gap: 20px; padding-top: 28px;
  }
}

/* ---------- 4F.14 Dos mejoras sin tocar una sola etiqueta ----------
   La FAQ pasa a dos columnas a partir de 1024: cero cambio de markup, asi que
   la paridad caracter por caracter con el FAQPage del schema queda intacta. */
@media (min-width: 1025px) {
  .kadima-faq details {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
    column-gap: 40px; align-items: start;
  }
  .kadima-faq summary { grid-column: 1; }
  .kadima-faq details > p { grid-column: 2; margin-top: 0; }
  /* Los pasos pasan de cuatro filas apiladas a cuatro columnas, y la linea de
     union gira de vertical a horizontal. */
  .kadima-steps { grid-template-columns: repeat(4, minmax(0, 1fr)); column-gap: 28px; }
  .kadima-step { grid-template-columns: minmax(0, 1fr); row-gap: 4px; }
  .kadima-step-n { grid-row: auto; font-size: 56px; }
  .kadima-step:not(:last-child)::before {
    left: 64px; right: -28px; top: 34px; bottom: auto; width: auto; height: 1px;
  }
}

/* ---------- 4F.7b linkrows como mosaico ----------
   La version anterior ponia un borde alrededor de una frase de enlaces separados
   por comas y le colgaba un icono. Seguia leyendose como una lista con vinetas,
   que es exactamente lo que habia que sacar. Ahora cada enlace es una tarjeta.

   Las comas y la conjuncion siguen en el DOM dentro de .kadima-linkrows__sep y
   se ocultan por CSS, no con el atributo hidden. La diferencia importa: la
   comprobacion de linea base de texto lee el DOM, asi que un `hidden` le borraria
   el separador y la seccion quedaria rechazada por cambiar el texto. */
ul.kadima-linkrows > li {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  padding: 0;
  background: none;
  border: 0;
}
.kadima-linkrows__sep {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.kadima-tile {
  display: inline-grid;
  grid-template-columns: 22px minmax(0, 1fr);
  align-items: center;
  column-gap: 11px;
  padding: 15px 20px;
  background: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
  transition: border-color .18s ease, transform .18s ease;
}
.kadima-tile > .kadima-ico {
  width: 22px;
  height: 22px;
  color: var(--e-global-color-accent-text);
}
.kadima-tile strong { font-weight: 600; }
/* El subrayado se va: dentro de una tarjeta el enlace ya se lee como accion, y
   cuatro subrayados seguidos ensucian la fila. El foco de teclado se mantiene. */
ul.kadima-linkrows .kadima-tile a {
  text-decoration: none;
  color: var(--e-global-color-ink);
}
.kadima-tile:hover,
.kadima-tile:focus-within {
  border-color: var(--e-global-color-accent);
  transform: translateY(-2px);
}
ul.kadima-linkrows .kadima-tile a:focus-visible {
  outline: 2px solid var(--e-global-color-accent-text);
  outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
  .kadima-tile { transition: none; }
  .kadima-tile:hover, .kadima-tile:focus-within { transform: none; }
}
@media (max-width: 640px) {
  ul.kadima-linkrows > li { gap: 10px; }
  .kadima-tile { padding: 13px 16px; width: 100%; }
}
/* La fila descriptiva conserva la caja: ahi el enlace viene con una frase que lo
   explica y una tarjeta chica no le da lugar. Se distingue del mosaico por la
   clase, que la pone el compositor segun lo que haya dentro del <li>. */
ul.kadima-linkrows > li.kadima-linkrows__row {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr);
  column-gap: 16px;
  align-items: start;
  padding: 20px 24px;
  background: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  border-left: 3px solid var(--e-global-color-accent);
}
ul.kadima-linkrows > li.kadima-linkrows__row > .kadima-ico {
  margin-top: 3px;
  color: var(--e-global-color-accent-text);
}
@media (max-width: 640px) {
  ul.kadima-linkrows > li.kadima-linkrows__row {
    grid-template-columns: 22px minmax(0, 1fr);
    column-gap: 12px;
    padding: 16px;
  }
}

/* ---------- Ritmo vertical: el padding estaba puesto dos veces ----------
   Medido en /home-remodeling-scarsdale-ny/ a 1440 el 2026-08-16. Cada seccion de
   contenido gastaba 336px en aire y ninguno era intencional:

     .e-con         padding 96px arriba y abajo   <- padding por defecto de contenedor
     .e-con-inner   padding 72px arriba y abajo   <- el --padding-top/bottom que cada
                                                     seccion tiene configurado y que
                                                     Elementor aplica al inner
     96 + 72 = 168 por lado = 336 por seccion

   Sobre 7077px de pagina eran unos 2000px, el 28%, y se leia como bloques sueltos
   separados por huecos en vez de como una pagina. Manda el que cada seccion
   declara, que es el que alguien eligio; se anula el de afuera.

   Quedan fuera el hero, que es :first-of-type y fija su propio padding, y la barra
   de confianza, que trabaja con 18px y colapsaria. */
[data-elementor-type="wp-page"] > .e-con.e-con:not(:first-of-type):not(:has(.kadima-trustbar)) {
  padding-top: 0;
  padding-bottom: 0;
}

/* ============================================================
   Pase de correcciones 4G, 2026-08-16. Sobre reporte del cliente.
   ============================================================ */

/* ---------- 4G.1 El par de CTA se subia al renglon del parrafo ----------
   Reporte: "los botones de Get Estimate y el numero estan muy a la derecha".
   Medido a 1440 en las 20 paginas donde el par son hijos sueltos: el H1 arranca
   en x113 y el boton en x789.

   La causa es la combinacion de dos reglas mias. El contenedor es fila con wrap,
   y los hijos de bloque llevan un tope de 660px. Un item de 660 en una linea de
   1200 deja 540 libres, asi que el boton, que mide por contenido, entra en ESA
   misma linea en vez de bajar.

   El tope de 660 es una medida de legibilidad de la linea de texto, no de layout.
   Va donde corresponde: sobre el texto, no sobre el widget que lo contiene. */
[data-elementor-type="wp-page"] > .e-con:first-of-type > .e-con-inner:has(> .kadima-hero-media):has(> .elementor-widget-button) > * {
  max-width: none;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) :is(h1, .elementor-widget-text-editor p, .kadima-crumbs) {
  max-width: 660px;
}

/* ---------- 4G.2 FAQ: vuelve al formato apilado ----------
   El anexo la habia pasado a dos columnas, pregunta a la izquierda y respuesta a
   la derecha. Decision del cliente: se vuelve al formato anterior. La pregunta
   arriba y la respuesta debajo, a todo el ancho.
   Se mantiene <details open>: Googlebot renderiza pero no hace clic. */
.kadima-faq details {
  display: block;
  column-gap: 0;
}
.kadima-faq summary,
.kadima-faq details > p {
  grid-column: auto;
}
.kadima-faq details > p {
  margin-top: 12px;
  max-width: 82ch;
}

/* ---------- 4G.3 La barra de licencias, en paneles ----------
   Reporte: "iconos tan pequenitos, esa area no se ve muy bien". Cierto: eran
   22px dentro de una franja de 64px de alto, con el numero de licencia a 15px.
   Es la seccion que sostiene la credibilidad del negocio y estaba tratada como
   un pie de pagina.
   Pasa a cuatro paneles, icono de 30px arriba y el dato debajo, con el filo
   bronce que ya usan las demas piezas. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-icons) {
  padding-top: 30px;
  padding-bottom: 30px;
}
ul.kadima-icons {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 16px;
}
ul.kadima-icons > li {
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  gap: 12px;
  padding: 20px 22px;
  background: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
  font-size: 15px;
  line-height: 1.45;
  text-align: left;
}
ul.kadima-icons > li + li {
  border-left: 1px solid var(--e-global-color-border);
}
ul.kadima-icons .kadima-ico {
  width: 30px;
  height: 30px;
  flex-basis: auto;
  color: var(--e-global-color-accent-text);
}
/* Sobre navy el panel no lleva relleno: seria una caja clara sobre un fondo
   oscuro y competiria con el hero que tiene arriba. */
ul.kadima-icons--invert > li {
  background: transparent;
  border-color: rgba(250, 248, 244, .22);
  border-top-color: var(--e-global-color-accent);
  color: var(--e-global-color-bg);
}
ul.kadima-icons--invert > li + li {
  border-left-color: rgba(250, 248, 244, .22);
}
ul.kadima-icons--invert .kadima-ico {
  color: var(--e-global-color-accent);
}
@media (max-width: 900px) {
  ul.kadima-icons {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
  }
  ul.kadima-icons > li + li { border-left: 1px solid var(--e-global-color-border); }
  ul.kadima-icons--invert > li + li { border-left-color: rgba(250, 248, 244, .22); }
}
@media (max-width: 560px) {
  ul.kadima-icons { grid-template-columns: minmax(0, 1fr); }
  ul.kadima-icons > li { padding: 16px 18px; }
}

/* ---------- 4G.4 Movimiento y pulido ----------
   Pedido del cliente: mas diseno y algo de movimiento. Tres reglas propias:

   1. Nada se mueve solo en bucle. El carrusel sigue descartado y no hay nada que
      llame la atencion de forma permanente. El movimiento aparece una vez, cuando
      la pieza entra en pantalla, y despues se queda quieta.
   2. Nada empuja el layout. Solo opacity y transform, que no reflowean.
   3. Con prefers-reduced-motion no queda NADA de esto, ni la entrada ni el hover
      que desplaza. Va envuelto entero en la media query, no parcheado despues. */

@keyframes kadimaEntra {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: no-preference) {
  /* La entrada al scroll usa animation-timeline: view(), que no necesita
     JavaScript ni un observer. Donde el navegador no lo soporta, y hoy son
     Safari y Firefox, la regla entera se descarta y la pieza aparece quieta y
     completa: la mejora es progresiva y su ausencia no rompe nada.
     El @supports es imprescindible: sin el, un navegador sin soporte aplica la
     animacion sin linea de tiempo, la corre una vez al cargar y las piezas de
     mas abajo terminan invisibles. */
  @supports (animation-timeline: view()) {
    .kadima-claim,
    .kadima-tile,
    .kadima-svc,
    .kadima-step,
    .kadima-card,
    .kadima-vs__side,
    .kadima-spec__list > li,
    ul.kadima-icons > li,
    .kadima-callout {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 40%;
    }
    /* Escalonado dentro de una misma grilla: la fila no entra de golpe. El tope
       es 6 porque mas alla se percibe como lentitud, no como ritmo. */
    .kadima-claim:nth-child(2), .kadima-svc:nth-child(2), ul.kadima-icons > li:nth-child(2) { animation-delay: .04s; }
    .kadima-claim:nth-child(3), .kadima-svc:nth-child(3), ul.kadima-icons > li:nth-child(3) { animation-delay: .08s; }
    .kadima-claim:nth-child(4), .kadima-svc:nth-child(4), ul.kadima-icons > li:nth-child(4) { animation-delay: .12s; }
    .kadima-claim:nth-child(5), .kadima-svc:nth-child(5) { animation-delay: .16s; }
    .kadima-claim:nth-child(6), .kadima-svc:nth-child(6) { animation-delay: .20s; }
  }

  /* Levante al pasar el mouse. 2px es deliberado: alcanza para que la pieza se
     lea como tocable y no tanto como para que la grilla parezca temblar. */
  .kadima-claim,
  .kadima-svc,
  .kadima-card,
  ul.kadima-icons > li {
    transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;
  }
  .kadima-claim:hover,
  .kadima-svc:hover,
  .kadima-card:hover,
  ul.kadima-icons > li:hover {
    transform: translateY(-2px);
    box-shadow: 0 10px 26px rgba(26, 43, 74, .10);
  }

  /* La foto se acerca despacio dentro de su marco. El marco no se mueve, asi que
     no hay reflow: el overflow: hidden de la figura recorta el excedente. */
  .kadima-claims__plate > img,
  .kadima-spec__plate > img,
  .kadima-splitband__media > img {
    transition: transform .5s cubic-bezier(.2, .6, .2, 1);
  }
  .kadima-claims__plate:hover > img,
  .kadima-spec__plate:hover > img,
  .kadima-splitband__media:hover > img {
    transform: scale(1.035);
  }
}

/* El subrayado del enlace de texto crece desde la izquierda. Se anima
   background-size y no un borde, asi que no cambia la caja ni una sola vez.
   Queda fuera de la media query de movimiento a proposito: sin transicion el
   cambio sigue siendo correcto, solo que instantaneo. */
.kadima-prose p a:not(.kadima-phone):not(.elementor-button),
.kadima-more a {
  background-image: linear-gradient(var(--e-global-color-accent), var(--e-global-color-accent));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% 2px;
  text-decoration: none;
  padding-bottom: 2px;
}
@media (prefers-reduced-motion: no-preference) {
  .kadima-prose p a:not(.kadima-phone):not(.elementor-button),
  .kadima-more a {
    background-size: 0% 2px;
    transition: background-size .26s ease, color .18s ease;
  }
  .kadima-prose p a:not(.kadima-phone):not(.elementor-button):hover,
  .kadima-prose p a:not(.kadima-phone):not(.elementor-button):focus-visible,
  .kadima-more a:hover,
  .kadima-more a:focus-visible {
    background-size: 100% 2px;
  }
}

/* El titulo de seccion con su filo bronce. Ya existia como regla suelta en
   algunos componentes; aca queda una sola vez para todas las secciones del
   cuerpo, que es lo que da el ritmo de lectura de arriba a abajo. */
[data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h2.elementor-heading-title {
  position: relative;
  padding-bottom: 18px;
}
[data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h2.elementor-heading-title::after {
  content: "";
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  bottom: 0;
  width: 44px;
  height: 3px;
  background: var(--e-global-color-accent);
}

/* ============================================================
   Pase 4H: rediseno estructural del cuerpo, 2026-08-16.
   Reporte del cliente: "estas haciendo cambios muy basicos, debes hacer cambios
   grandes para que se vea la diferencia". Tenia razon. Lo anterior eran tarjetas
   sobre cream repetidas de arriba a abajo: mismo ancho, mismo fondo, misma escala.
   Una pagina se lee como pagina cuando las secciones NO se parecen entre si.

   Tres palancas, en orden de impacto:
     1. ancho    algunas secciones rompen el contenedor y van de borde a borde
     2. fondo    bloques navy a sangre alternando con los claros
     3. escala   el titulo de seccion y los numerales crecen de verdad
   ============================================================ */

/* ---------- 4H.1 Romper el contenedor ----------
   Elementor deja la seccion a todo el ancho y angosta el .e-con-inner a 1200 con
   margenes automaticos. Para sangrar no hace falta 100vw, que ademas cuenta la
   barra de scroll y produce desborde horizontal: alcanza con soltar el inner.
   El encabezado se vuelve a meter en la caja de 1200 aparte, porque un titulo
   pegado al borde de la ventana no se lee. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband),
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) {
  padding-left: 0;
  padding-right: 0;
  overflow: hidden;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner {
  max-width: none;
  width: 100%;
  margin: 0;
  padding: 0;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget-heading,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget-heading {
  max-width: 1248px;
  margin-left: auto;
  margin-right: auto;
  padding-left: 24px;
  padding-right: 24px;
}

/* ---------- 4H.2 Banda partida: la foto toca el borde de la ventana ----------
   Antes era una foto encajonada con un panelito de texto encima, todo dentro de
   los 1200. Ahora la mitad de la pantalla es foto, a sangre y a toda la altura de
   la banda, y el texto ocupa la otra mitad con aire de sobra.

   El padding del lado del texto se calcula para que su borde exterior caiga
   exactamente donde cae el contenedor de 1200 en el resto de la pagina: asi la
   seccion sangra pero el texto sigue alineado con todo lo demas. */
.kadima-splitband {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: stretch;
  gap: 0;
  width: 100%;
}
.kadima-splitband .kadima-sb__media {
  position: relative;
  margin: 0;
  min-height: 480px;
  overflow: hidden;
}
.kadima-splitband .kadima-sb__media > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
}
.kadima-splitband .kadima-sb__body {
  margin: 0;
  border: 0;
  align-self: center;
  padding: 64px clamp(24px, calc((100vw - 1200px) / 2 + 24px), 240px) 64px 64px;
  max-width: none;
}
.kadima-splitband--flip .kadima-sb__body {
  margin: 0;
  border: 0;
  padding: 64px 64px 64px clamp(24px, calc((100vw - 1200px) / 2 + 24px), 240px);
}
/* La primera frase de la banda entra como bajada, no como un parrafo mas. */
.kadima-splitband .kadima-sb__body > p:first-of-type {
  font-size: clamp(19px, 1.45vw, 23px);
  line-height: 1.55;
  color: var(--e-global-color-ink);
}
.kadima-splitband .kadima-sb__body > p + p {
  color: var(--e-global-color-muted);
}
@media (max-width: 900px) {
  .kadima-splitband,
  .kadima-splitband--flip {
    grid-template-columns: minmax(0, 1fr);
  }
  .kadima-splitband .kadima-sb__media { min-height: 0; aspect-ratio: 16 / 10; }
  .kadima-splitband .kadima-sb__body,
  .kadima-splitband--flip .kadima-sb__body {
    padding: 36px 24px 40px;
  }
}

/* ---------- 4H.3 Las afirmaciones, sobre navy y a sangre ----------
   Es el bloque que contesta "por que estos y no otros", asi que se lleva el
   tratamiento mas fuerte de la pagina: fondo navy de borde a borde, media pantalla
   de foto, y las tarjetas sin caja, apoyadas en un filo bronce.
   Cream sobre navy da 13.3:1; el bronce solo se usa como filo y como numeral,
   nunca como texto corrido, porque sobre navy da 3.6:1. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) {
  background: var(--e-global-color-ink);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) h2.elementor-heading-title,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__list > p {
  color: var(--e-global-color-bg);
}
.kadima-claims {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: stretch;
  gap: 0;
  width: 100%;
}
.kadima-claims .kadima-claims__plate {
  min-height: 560px;
  border-top: 0;
  background: transparent;
}
.kadima-claims .kadima-claims__list {
  align-content: center;
  gap: 0;
  padding: 56px clamp(24px, calc((100vw - 1200px) / 2 + 24px), 240px) 56px 56px;
}
.kadima-claims .kadima-claim {
  background: transparent;
  border: 0;
  border-left: 3px solid var(--e-global-color-accent);
  padding: 4px 0 22px 22px;
  margin-bottom: 22px;
}
.kadima-claims .kadima-claim:last-of-type { margin-bottom: 0; padding-bottom: 4px; }
.kadima-claims .kadima-claim .kadima-claim__t {
  color: var(--e-global-color-bg);
  font-size: clamp(19px, 1.5vw, 23px);
}
.kadima-claims .kadima-claim .kadima-claim__b {
  color: var(--e-global-color-border);
}
.kadima-claims .kadima-claim .kadima-ico {
  color: var(--e-global-color-accent);
  width: 26px;
  height: 26px;
}
@media (max-width: 900px) {
  .kadima-claims { grid-template-columns: minmax(0, 1fr); }
  .kadima-claims .kadima-claims__plate { min-height: 0; aspect-ratio: 16 / 10; }
  .kadima-claims .kadima-claims__list { padding: 36px 24px 40px; }
}

/* ---------- 4H.4 Escala ----------
   El titulo de seccion estaba en 38px fijos, apenas el doble del cuerpo de 18.
   Esa distancia es la que hacia que todo se leyera parejo. Va a escala fluida y
   llega a 56 en desktop, que contra un cuerpo de 18 es una relacion de 3.
   clamp y no un salto por breakpoint: entre 900 y 1440 el titulo crece con la
   ventana en vez de quedarse chico hasta el ultimo corte. */
[data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h2.elementor-heading-title {
  font-size: clamp(30px, 3.4vw, 56px);
  line-height: 1.12;
  letter-spacing: -0.015em;
}
[data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h3 {
  font-size: clamp(18px, 1.4vw, 22px);
}

/* Numeral de paso: era 56px y competia con el titulo. Pasa a ser el elemento mas
   grande de su seccion y se apoya en bronce translucido, asi no pelea por la
   lectura con el texto del paso pero da la escala que faltaba. */
.kadima-step-n {
  font-size: clamp(56px, 6.5vw, 104px);
  line-height: .85;
  color: var(--e-global-color-accent);
  opacity: .38;
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-weight: 600;
}

/* El dato duro dentro de una ficha: es lo que la gente viene a buscar (numero de
   licencia, plazo, telefono del municipio) y estaba al mismo tamano que el resto
   de la frase. */
.kadima-key {
  font-size: 1.06em;
  color: var(--e-global-color-ink);
  background: linear-gradient(transparent 62%, rgba(166, 124, 63, .22) 62%);
  padding: 0 2px;
}
.e-con:has(.kadima-claims) .kadima-key,
.e-con:has(.kadima-mark-cta) .kadima-key {
  color: var(--e-global-color-bg);
  background: linear-gradient(transparent 62%, rgba(166, 124, 63, .45) 62%);
}

/* Una seccion a sangre no lleva el padding vertical de las de caja: su aire ya
   esta en el padding interno de cada mitad. Sin esto queda el doble. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner {
  padding-top: 0;
  padding-bottom: 0;
  row-gap: 0;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget-heading,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget-heading {
  padding-top: 64px;
  padding-bottom: 8px;
}

/* Dentro de la banda a sangre las afirmaciones tienen media pantalla, no la
   pantalla entera: dos columnas ahi dejan renglones de 24 caracteres, que se
   leen como una tabla y no como un argumento. Una sola columna, con mas cuerpo.
   Medido a 1440: la columna de texto pasa de 233px a 490px de ancho util. */
.kadima-claims .kadima-claims__list {
  grid-template-columns: minmax(0, 1fr);
}
.kadima-claims .kadima-claim .kadima-claim__b {
  font-size: 16.5px;
  line-height: 1.6;
  max-width: 56ch;
}

/* ============================================================
   Pase 4I: el idioma del hero, aplicado a todo el cuerpo. 2026-08-16.
   Reporte: "lo unico que me gusto fue el hero section, ahora debes adaptar eso
   para todas las secciones para que el website mantenga su esencia".

   La formula del hero son cinco cosas, y se copian tal cual, no parecidas:
     1. la foto es el FONDO de la seccion, no un panel al lado
     2. encima va un velo navy en gradiente, oscuro donde cae el texto y casi
        transparente del otro lado, para que la obra se siga viendo
     3. el texto va cream, alineado a la izquierda, sobre la parte oscura
     4. el acento es bronce y solo como filo, nunca como texto sobre navy
     5. la columna de texto se capa a 660px, que es la medida de lectura

   El gradiente es EL MISMO del hero, copiado literal. Sus paradas estan medidas:
   con una caida lineal el contraste bajaba a 2.88:1 donde todavia hay texto, asi
   que la meseta se sostiene hasta el 50% y recien ahi cae. Cambiarlo por uno
   "parecido" rompe la unica parte que ya estaba verificada.
   ============================================================ */

/* ---------- 4I.1 Las bandas con foto se comportan como el hero ---------- */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband),
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--e-global-color-ink);
  min-height: 560px;
  justify-content: center;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband)::before,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims)::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(100deg,
    rgba(26, 43, 74, .94) 0%,
    rgba(26, 43, 74, .90) 50%,
    rgba(26, 43, 74, .55) 68%,
    rgba(26, 43, 74, .20) 85%,
    rgba(26, 43, 74, .12) 100%);
}

/* La foto deja de ser una mitad y pasa a ser el fondo entero. Sale del flujo:
   si queda dentro, su altura intrinseca se reparte en las filas de la grilla y
   la seccion crece sin motivo. Es el mismo defecto que ya documentamos con el
   hero, y `min-height: 0` no lo arregla porque no cambia lo que el item aporta. */
.kadima-splitband .kadima-sb__media,
.kadima-claims .kadima-claims__plate {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  height: 100%;
  min-height: 0;
  margin: 0;
  border: 0;
  aspect-ratio: auto;
  background: transparent;
}
.kadima-splitband .kadima-sb__media > img,
.kadima-claims .kadima-claims__plate > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
}

/* El contenido vuelve a una sola columna a la izquierda, encima del velo, con la
   misma medida de lectura del hero. Ya no hay grilla de dos mitades: la mitad
   derecha es la foto asomando por debajo del gradiente. */
.kadima-splitband,
.kadima-claims {
  display: block;
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 1248px;
  margin: 0 auto;
  padding: 72px 24px;
}
.kadima-splitband .kadima-sb__body,
.kadima-splitband--flip .kadima-sb__body,
.kadima-claims .kadima-claims__list {
  position: relative;
  z-index: 2;
  margin: 0;
  padding: 0;
  border: 0;
  max-width: 660px;
  align-self: auto;
  text-align: left;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) :is(h2, p, h3, li, summary),
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) :is(h2, p, h3, li, summary) {
  color: var(--e-global-color-bg);
}
/* El titulo tambien se alinea a la izquierda y su filo bronce deja de estar
   centrado: en el hero nada esta centrado, y esa es media esencia. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget-heading,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget-heading {
  position: relative;
  z-index: 2;
  max-width: 1248px;
  margin: 0 auto;
  padding: 0 24px;
  text-align: left;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) h2.elementor-heading-title,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) h2.elementor-heading-title {
  text-align: left;
  max-width: 900px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) h2.elementor-heading-title::after,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) h2.elementor-heading-title::after {
  left: 0;
  transform: none;
}

/* Las afirmaciones sobre la foto: sin caja, filo bronce, como en la banda. */
.kadima-claims .kadima-claim {
  background: transparent;
  border: 0;
  border-left: 3px solid var(--e-global-color-accent);
  padding: 2px 0 18px 20px;
  margin-bottom: 18px;
}
.kadima-claims .kadima-claim__b { color: var(--e-global-color-border); }

@media (max-width: 900px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband),
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) {
    min-height: 0;
  }
  /* En movil el texto ocupa todo el ancho, asi que el velo tiene que ser parejo
     de arriba abajo y no de izquierda a derecha. Mismo criterio que el hero. */
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband)::before,
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims)::before {
    background: linear-gradient(180deg,
      rgba(26, 43, 74, .92) 0%,
      rgba(26, 43, 74, .90) 60%,
      rgba(26, 43, 74, .86) 100%);
  }
  .kadima-splitband,
  .kadima-claims { padding: 44px 24px; }
  .kadima-splitband .kadima-sb__body,
  .kadima-claims .kadima-claims__list { max-width: none; }
}

/* ---------- 4I.2 Correccion: el velo quedaba DEBAJO de la foto ----------
   Sintoma: en la banda el texto cream salia sobre la foto clara, ilegible.

   Causa: le habia puesto `position: relative; z-index: 2` al contenedor de la
   banda. Eso crea un contexto de apilamiento propio, y a partir de ahi TODO lo
   que esta adentro se apila dentro de esa burbuja: la foto, aunque tenga
   z-index 0, pinta por encima del ::before de la seccion, que vive en el
   contexto de afuera. El z-index de un hijo nunca compite contra algo que esta
   fuera de su contexto.

   La regla practica: el elemento que envuelve a la foto NO puede crear contexto.
   Se lo saca, la foto se posiciona contra la seccion, que si es relative, y el
   texto sube con su propio z-index dentro del contexto de la seccion. */
.kadima-splitband,
.kadima-claims {
  position: static;
  z-index: auto;
}
.kadima-splitband .kadima-sb__body,
.kadima-splitband--flip .kadima-sb__body,
.kadima-claims .kadima-claims__list,
.kadima-claims .kadima-claim {
  background: transparent;
  box-shadow: none;
}

/* ---------- 4I.3 Dos remates de la banda ----------
   a) El titulo salia centrado aunque su text-align fuera left. No era la
      alineacion del texto: era el ANCHO. Elementor centra los hijos del
      .e-con-inner, asi que el widget se encoge a su contenido y despues alinear
      a la izquierda dentro de una caja de 370px no mueve nada. Medido: el widget
      arrancaba en x503 en vez de x113. Necesita ocupar el ancho, no alinearse.
   b) El dato resaltado conservaba el color ink sobre navy, o sea invisible.
      La regla clara solo contemplaba el fondo cream. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget-heading,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget-heading {
  width: 100%;
  align-self: stretch;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) h2.elementor-heading-title,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) h2.elementor-heading-title {
  display: block;
  max-width: 900px;
  margin-left: 0;
  margin-right: auto;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-key,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-key {
  color: var(--e-global-color-bg);
  background-image: linear-gradient(transparent 62%, rgba(166, 124, 63, .5) 62%);
}
/* Los enlaces dentro de una banda oscura: el subrayado bronce sobre navy se
   pierde, asi que el trazo pasa a cream y el texto tambien. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-prose p a,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-prose p a,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-more a,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-more a {
  color: var(--e-global-color-bg);
}
/* El degradado del subrayado se separa del color y EXCLUYE al telefono.
   Por que: este degradado es la tecnica de subrayado que se anima por
   background-size, y las propiedades que lo achican a una franja de 2px
   (background-size, repeat y position) viven en la regla de la linea 1906, que
   excluye .kadima-phone con :not(). Al declarar aca solo background-image sin
   esas tres, el telefono heredaba los valores por defecto, auto y repeat, y el
   degradado bronce dejaba de ser un subrayado para RELLENAR la caja entera.
   Con el padding lateral de 8px del propio chip, eso se veia como una chapa
   bronce detras del numero. Medido en /projects/: background-size resolvia a
   auto y background-repeat a repeat.
   El telefono no necesita el degradado: tiene su propio border-bottom de 2px
   bronce, que es como se ve el del footer y el del header. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-prose p a:not(.kadima-phone),
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-prose p a:not(.kadima-phone),
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-more a,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-more a {
  background-image: linear-gradient(var(--e-global-color-accent), var(--e-global-color-accent));
}

/* Y el telefono, cuando va DENTRO de una frase de prosa, se lee como parte de la
   frase y no como una pieza aparte. .kadima-phone es un componente de todo el
   sitio y trae lo suyo: 16px contra los 17 del parrafo, peso 600 contra 400, y
   8px de padding lateral que abren un hueco antes y despues del numero. Eso esta
   bien en el header y en el pie, donde el telefono ES la pieza; adentro de una
   oracion queda como un recuadro pegado al texto.
   Se hereda tipografia y se saca el padding lateral. Se conserva el
   border-bottom bronce, que es lo que sigue diciendo que es un enlace, y por
   supuesto el href tel:. La cadena nombra la seccion oscura, asi que el
   telefono del header y el del pie no se tocan. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-prose p a.kadima-phone,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-prose p a.kadima-phone {
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  line-height: inherit;
  padding-left: 0;
  padding-right: 0;
}

/* El texto de la banda caia en x24 en vez de x113: el div lleva tambien la clase
   kadima-prose, y una regla de dos clases le pone max-width: none, que le gana a
   mi max-width de una sola clase. Se nombra la seccion para subir el peso y que
   el eje del cuerpo coincida con el del titulo y con el del H1 del hero. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-splitband,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims {
  max-width: 1248px;
  margin-left: auto;
  margin-right: auto;
  padding: 72px 24px;
}
@media (max-width: 900px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-splitband,
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims {
    padding: 44px 24px;
  }
}

/* ---------- 4I.4 Arregla el residuo de 23px al pie de la banda ----------
   Sintoma, ubicado midiendo con getComputedStyle en produccion: en algunas
   secciones (medido primero en /home-remodeling-scarsdale-ny/, "The Houses
   Here", 23px a 1440) queda una franja de fondo navy solido, sin foto, al pie
   de la banda. No centrada: gapArriba 0, gapAbajo 23. Solo se ve cuando el
   texto de la banda es corto; en 12 de las 15 secciones con splitband/claims
   el texto ya supera los 560px por si solo y el sintoma no aparece, por eso
   quedo "sin ubicar" tanto tiempo.

   Causa real, en dos partes que se pisan sin que ninguna de las dos este mal
   por si sola:

   1. La foto (.kadima-sb__media / .kadima-claims__plate, position:absolute;
      inset:0) NO se posiciona contra .e-con, que es lo que 4I.1 buscaba (tiene
      min-height:560px y position:relative para exactamente esto). Se posiciona
      contra el wrapper propio de Elementor (.elementor-widget, framework, no
      de este kit), que TAMBIEN es position:relative por defecto y que ademas
      esta MAS CERCA en el arbol de ancestros. 4I.2 le saco position:relative a
      .kadima-splitband/.kadima-claims para arreglar un problema real de
      contexto de apilamiento (el velo quedaba debajo de la foto), y ese cambio
      correcto tuvo un efecto secundario no previsto: el inset:0 de la foto
      paso a anclarse un nivel mas arriba de lo pensado, pero no llego hasta
      .e-con. Se ancla al wrapper de Elementor, que se ajusta exacto a su
      contenido (391.8px medido en scarsdale) y no a los 560px disponibles.

   2. .e-con-inner es flex column y su justify-content queda en el default
      (normal, que equivale a flex-start): el sobrante de min-height se
      acumula entero al final, detras del ultimo item. Como la foto esta atada
      al wrapper corto, ese sobrante queda pintado con el fondo propio de
      .e-con (ink solido) y no con la foto.

   El arreglo no toca la causa 1 (el wrapper de Elementor sigue siendo el
   ancestro posicionado, y esta bien que lo sea: seguir intentando que sea
   .e-con reabriria el bug de 4I.2). Se resuelve la causa 2: se hace crecer el
   wrapper para que consuma el sobrante de flex, en vez de dejarlo vacio. Con
   flex-grow:1 el wrapper pasa a medir el alto disponible completo, y como es
   el ancestro posicionado real, el inset:0 de la foto lo sigue sin que haga
   falta tocar .kadima-splitband ni .kadima-sb__media: son position:static y
   position:absolute respectivamente y ninguno de los dos cambia. Verificado
   sin estilo inline de Elementor de por medio (getAttribute('style') dio
   null), asi que una regla de clase alcanza sin pelear contra un !important
   ajeno. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget:has(> .kadima-splitband),
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget:has(> .kadima-claims) {
  flex-grow: 1;
}

/* ---------- 4J.1 FAQ cerrada por defecto ----------
   Decision del cliente 2026-08-16. Revierte la Decision 7.3 / 09.5, que las dejaba
   abiertas porque Googlebot renderiza pero no hace clic. Lo que hace aceptable el
   cambio: el contenido sigue EN EL DOM, solo que no renderizado, y el bloque
   FAQPage del JSON-LD no se toca, asi que el rich result sale del schema y no del
   HTML visible.

   Cerrada, la fila tiene que leerse como algo que se abre: area de clic completa,
   destino tactil holgado y un signo que gire. */
.kadima-faq details {
  border: 1px solid var(--e-global-color-border);
  border-left: 3px solid var(--e-global-color-accent);
  background: var(--e-global-color-surface);
  margin-bottom: 12px;
}
.kadima-faq summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  cursor: pointer;
  padding: 20px 24px;
  min-height: 44px;
  list-style: none;
  font-size: clamp(17px, 1.25vw, 19px);
  line-height: 1.4;
  color: var(--e-global-color-ink);
}
.kadima-faq summary::-webkit-details-marker { display: none; }
/* El signo se dibuja con CSS y no con un caracter: un glifo cambia de forma segun
   la fuente que cargue y en el fallback aparece un cuadro. */
.kadima-faq summary::after {
  content: "";
  flex: 0 0 12px;
  width: 12px;
  height: 12px;
  border-right: 2px solid var(--e-global-color-accent);
  border-bottom: 2px solid var(--e-global-color-accent);
  transform: rotate(45deg) translate(-2px, -2px);
  transform-origin: center;
}
.kadima-faq details[open] > summary::after {
  transform: rotate(225deg) translate(-2px, -2px);
}
.kadima-faq details[open] > summary {
  color: var(--e-global-color-accent-text);
}
.kadima-faq details > p {
  margin: 0;
  padding: 0 24px 22px;
  max-width: 82ch;
  color: var(--e-global-color-muted);
}
.kadima-faq summary:hover { background: var(--e-global-color-bg); }
.kadima-faq summary:focus-visible {
  outline: 2px solid var(--e-global-color-accent-text);
  outline-offset: -2px;
}
@media (prefers-reduced-motion: no-preference) {
  .kadima-faq summary::after { transition: transform .22s ease; }
  .kadima-faq summary { transition: background-color .18s ease; }
}

/* ---------- 4J.2 Rellenos parejos ----------
   Reporte: "tienen espacios muy desproporcionados en cuanto a los rellenos, no es
   simetrico". Medido a 1440 en /home-remodeling-scarsdale-ny/ y /bathroom-remodeling/:

     seccion de caja          72 arriba / 72 abajo    ok
     banda con foto           64 arriba / 51 abajo    desparejo
     cierre de bathroom       72 arriba / 88 abajo    desparejo

   En la banda el desnivel venia de repartir el relleno entre dos elementos: el
   widget del titulo ponia 64 arriba y 8 abajo, y ademas la banda ponia 72 arriba y
   72 abajo. Sumados daban 64 arriba, 80 en el medio y 72 abajo, o sea tres numeros
   distintos donde tiene que haber uno.

   El relleno vertical lo pone UN solo elemento. El titulo aporta el de arriba, la
   banda el de abajo, y entre los dos queda el hueco de lectura y nada mas. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget-heading,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget-heading {
  padding-top: 72px;
  padding-bottom: 0;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-splitband,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims {
  padding-top: 28px;
  padding-bottom: 72px;
}
/* El cierre traia 88 abajo por una regla vieja del CTA. Se empareja con el resto. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-cta) > .e-con-inner {
  padding-top: 72px;
  padding-bottom: 72px;
}
@media (max-width: 900px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .elementor-widget-heading,
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) > .e-con-inner > .elementor-widget-heading {
    padding-top: 44px;
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-splitband,
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims {
    padding-top: 20px;
    padding-bottom: 44px;
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-cta) > .e-con-inner {
    padding-top: 48px;
    padding-bottom: 48px;
  }
}
/* ============================================================
   4H  LAS FICHAS DE CERTIFICACION. El bloque de licencias como
   tarjetas horizontales: icono a la izquierda, texto a la derecha.
   20 secciones, la que va justo debajo del hero en cada pagina.

   NI UNA PALABRA NUEVA, Y NI UN BYTE DE MARKUP. Esta pasada es CSS puro:
   el markup de los 20 widgets queda exactamente como esta. La invariante de
   texto se cumple por construccion y no por comprobacion: si el HTML no
   cambia, el texto no puede cambiar.

   Todo se ve siempre. No hay nada detras de un hover, asi que el teclado, el
   tacto y un puntero grueso ven exactamente lo mismo que un mouse. Eso cierra
   el hueco de la version anterior, donde el numero de licencia solo aparecia
   al pasar el mouse y en escritorio sin mouse no habia forma de alcanzarlo.

   El reparto de roles sale de las clases que ya existen:
     .kadima-cert__key  es el NOMBRE   cream, versalitas, 11.5px
     .kadima-cert__val  es el DATO     bronce claro, 15px, sin cortes
   El orden en el DOM no es fiable, cambia por campo ("NYC DCWP" viene antes de
   su numero, "General Liability" viene despues de "$1M"), asi que nombre y
   dato se colocan por grid-row segun su clase y no por orden.
   ============================================================ */

/* ---------- 4H.0 Tokens derivados ---------- */
:root {
  --k-scrim: rgba(26, 43, 74, .55);
  --k-hair: rgba(250, 248, 244, .22);
  --k-cert-panel: rgba(26, 43, 74, .55);
  --k-cert-borde: rgba(250, 248, 244, .1);
}
@supports (color: color-mix(in srgb, red 50%, white)) {
  :root {
    --k-scrim: color-mix(in srgb, var(--e-global-color-ink) 55%, transparent);
    --k-hair: color-mix(in srgb, var(--e-global-color-bg) 22%, transparent);
  }
}

/* --k-cert-dato se declara sobre la BANDA y no en :root, y el motivo no es
   estilistico. Arriba de todo (linea 7) el kit aliasea en :root solamente ink,
   bg, accent-text, accent-button, muted, border y surface.
   --e-global-color-accent NO esta ahi: Elementor lo define en .elementor-kit-5,
   o sea en el <body>, y las custom properties heredan hacia abajo, nunca hacia
   arriba. Un var() suyo dentro de :root da un valor invalido; entonces
   color: var(--k-cert-dato) queda invalido en tiempo de computo y la propiedad
   cae al color HEREDADO, que en las 11 paginas claras es el navy de
   ul.kadima-icons > li: el dato salia navy sobre navy, ilegible. Encontrado
   midiendo con getComputedStyle, no leyendo la hoja.

   MEDICION DE CONTRASTE, para que quede en el archivo y no en un chat.
   Sobre el panel rgba(26,43,74,.55) apoyado en el velo, el fondo va de
   rgb(26,43,74) a rgb(49,64,92) segun que tan clara sea la foto debajo.

   El bronce puro NO servia para el dato:
     dato #A67C3F 15px       2.77:1   pide 4.5   NO PASA
   Oscurecer el panel no es camino: con el panel 100% OPACO el bronce puro
   llega a 3.75:1 y sigue sin pasar, porque ese es el techo del par
   bronce/navy. Y un panel opaco borraria la foto y dejaria el backdrop-filter
   sin sentido. Asi que lo que se mueve es el color del dato.

   OJO CON ESTA CUENTA, ya se erro una vez. El piso depende del alfa del
   panel, no solo del color: sobre el panel a .55 el peor fondo es #31405C,
   pero sobre un panel a .85 seria #22354F, bastante mas oscuro. Un valor
   medido para un alfa NO vale para otro. Aclarar el bronce un 20% da 4.56:1
   sobre un panel .85 y solo 3.71:1 sobre este de .55: no alcanza. El minimo
   que pasa acá es +35% de cream.
     nombre cream 11.5px      9.82:1   pide 4.5   PASA
     dato   #C3A77E 15px      4.56:1   pide 4.5   PASA   (6.18:1 sobre el
                                                          fondo mas oscuro)
     icono  #A67C3F 42px      2.77:1   pide 3     ver abajo
   El icono se queda en bronce PURO a proposito: lleva aria-hidden, repite la
   etiqueta que tiene al lado y no transmite nada por si solo, asi que no es
   grafico esencial y su 2.77:1 no deja informacion inalcanzable. Aclararlo
   tambien habria despegado el icono del idioma visual del sitio sin ganar
   nada medible.

   Las DOS declaraciones de abajo tienen que decir lo mismo. La de @supports
   no es un adorno: en cualquier navegador con color-mix, que hoy son todos,
   es la que gana. Si se cambia solo el literal, el valor real no se mueve. */
.kadima-cert { --k-cert-dato: #C3A77E; }
@supports (color: color-mix(in srgb, red 50%, white)) {
  .kadima-cert {
    --k-cert-dato: color-mix(in srgb, var(--e-global-color-accent) 65%, var(--e-global-color-bg));
  }
}

/* La cadena mira :has(> .kadima-icons) y el hijo directo del widget es
   .kadima-cert. Sin esta regla el widget se dimensiona por contenido y la
   banda deja de ser del ancho del contenedor. */
.e-con-inner > .elementor-widget:has(> .kadima-cert) {
  align-self: stretch; width: 100%;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-cert) {
  padding-top: 40px; padding-bottom: 40px;
}

/* ---------- 4H.1 La banda ---------- */
.kadima-cert {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  width: 100%;
  padding: 20px;
  background: var(--e-global-color-ink);
  border-top: 3px solid var(--e-global-color-accent);
}
/* La foto sale del flujo. Regla de CLAUDE.md: un <img> con altura intrinseca
   dentro de un item de grilla aporta esa altura a cada track que cruza, y
   min-height: 0 no lo arregla. Aca la placa entera es absoluta, asi que la
   banda la mide el contenido y la foto se recorta con object-fit. */
.kadima-cert__plate { position: absolute; inset: 0; z-index: 0; }
.kadima-cert__plate > img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: 100%; object-fit: cover;
  object-position: center 55%;
}
/* Velo plano, el mismo --k-veil de 4F.10: ink al 78%. Sobre el peor caso
   posible, una foto blanca pura, compone #4C5A72. */
.kadima-cert__plate::after {
  content: ""; position: absolute; inset: 0; background: var(--k-veil);
}

/* ---------- 4H.2 La fila ----------
   grid-auto-flow: column pone TODAS las fichas en una sola fila sin que la
   hoja tenga que saber cuantas son: cuatro en 19 paginas y cinco en la home.
   Es lo que evita una rama :has() contando hijos, y con ella evita tener que
   repetir esa rama dentro de cada breakpoint.

   El doble ul.kadima-icons.kadima-cert__rec no es decorativo: las reglas de la
   barra vieja (lineas 1496, 1794, 1802) apuntan a ul.kadima-icons a secas
   dentro de sus media queries, y una media query no suma especificidad. Con
   (0,2,0) esta base les gana en todo ancho, asi que los breakpoints de abajo
   repiten la misma cadena para poder ganarse a si misma. */
ul.kadima-icons.kadima-cert__rec {
  position: relative; z-index: 1;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  gap: 12px;
  margin: 0; padding: 0;
  list-style: none; width: 100%;
}

/* ---------- 4H.3 La ficha ----------
   Horizontal: una columna fija de 42px para el icono y el resto para el texto.
   El backdrop-filter necesita el prefijo -webkit- para Safari; sin el, la
   ficha se ve igual pero sin el desenfoque, que es degradado aceptable. */
ul.kadima-icons.kadima-cert__rec > .kadima-cert__field {
  display: grid;
  grid-template-columns: 42px minmax(0, 1fr);
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  background: var(--k-cert-panel);
  border: 1px solid var(--k-cert-borde);
  border-radius: 6px;
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  text-align: left;
}
/* La barra vieja mete un filete entre items. Sobra ahora que cada ficha tiene
   su propia caja con borde en los cuatro lados. */
ul.kadima-icons.kadima-cert__rec > .kadima-cert__field + .kadima-cert__field {
  border-left: 1px solid var(--k-cert-borde);
}

/* ---------- 4H.4 El icono ----------
   stroke-width se pone por CSS y no tocando el markup: los <svg> traen
   stroke-width="1.5" como atributo de presentacion, y una declaracion CSS le
   gana a un atributo de presentacion. Asi los 20 widgets quedan intactos. */
ul.kadima-icons.kadima-cert__rec .kadima-ico {
  grid-column: 1;
  width: 42px; height: 42px; flex: none;
  color: var(--e-global-color-accent);
  stroke-width: 1.3;
}

/* ---------- 4H.5 El nombre y el dato ----------
   Dos renglones. El nombre arriba y el dato abajo, por clase y no por orden
   de DOM. Los dos se ven siempre. */
.kadima-cert__data {
  grid-column: 2;
  display: grid;
  grid-template-rows: auto auto;
  gap: 3px;
  min-width: 0;
}
/* justify-items se deja en su valor inicial a proposito. Con "start" los dos
   <span> se dimensionan por max-content y se salen de la columna en vez de
   acomodarse adentro: medido en la home, "Westchester County" ocupaba 158px
   dentro de una columna de 134px y se montaba sobre la ficha vecina. Estirados
   a la columna, el nombre parte en dos renglones donde ya hay un espacio y el
   dato queda gobernado por su propio nowrap. */
.kadima-cert__key,
.kadima-cert__val { min-width: 0; max-width: 100%; }
.kadima-cert__key {
  grid-row: 1;
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 11.5px; font-weight: 600; line-height: 1.3;
  letter-spacing: .085em; text-transform: uppercase;
  color: var(--e-global-color-bg);
}
.kadima-cert__val {
  grid-row: 2;
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 15px; font-weight: 600; line-height: 1.25;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--k-cert-dato);
}
/* "Licensed & Insured" no tiene .kadima-cert__key: es la unica de las seis
   etiquetas del sitio que no se parte en dos, porque no hay un espacio que
   separe autoridad de numero. Sin esta regla su ficha quedaria sin nombre y
   con un dato suelto en bronce, desalineada con las otras tres. Cuando no hay
   nombre, el dato ES el nombre: sube al renglon 1 y se viste como nombre.
   Cero palabras agregadas, que es la unica salida que el pliego permite.
   Ningun breakpoint de abajo toca font-size ni color sobre .kadima-cert__val,
   justamente para que esta rama :has() no tenga que repetirse en cada uno. */
.kadima-cert__data:not(:has(> .kadima-cert__key)) > .kadima-cert__val {
  grid-row: 1;
  font-size: 11.5px;
  letter-spacing: .085em;
  text-transform: uppercase;
  white-space: normal;
  color: var(--e-global-color-bg);
}

/* ---------- 4H.6 Movimiento ----------
   4G.4 le aplica kadimaEntra a ul.kadima-icons > li con fill "both", y su
   fotograma final dice transform: none. Una animacion gana en la cascada por
   encima de cualquier declaracion normal, asi que cualquier transform que la
   ficha quiera declarar queda muerto mientras esa animacion siga puesta.
   Aca no hay hover que desplace, pero se anula igual para que la entrada sea
   de la banda entera y no de cuatro cajas escalonadas, que con fichas de este
   tamano se lee como parpadeo. */
ul.kadima-icons.kadima-cert__rec > .kadima-cert__field { animation: none; }

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .kadima-cert {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 40%;
    }
  }
}

/* ---------- 4H.7 Breakpoints ----------
   Cada cadena repite ul.kadima-icons.kadima-cert__rec porque la base tambien
   la usa: una media query no suma especificidad y con la cadena corta perderia
   contra su propia base en todo ancho. Es la regla de CLAUDE.md sobre repetir
   la rama dentro del breakpoint, aplicada por el mismo motivo. */
/* La home lleva CINCO fichas en la misma fila de 1200px, y ahi la aritmetica
   no cierra: 1200 menos 4 huecos de 12 da 288 por ficha, y descontando 32 de
   relleno, 42 de icono y 12 de hueco quedan 134px de texto. El dato mas ancho,
   "#WC-39446-H20-25", pide 168px a 15px y con nowrap no puede ceder: se sale de
   la ficha. Medido en la home servida, a 1440, 1280 y 1100.
   Las 19 paginas de cuatro fichas tienen 193px y no necesitan nada.

   Se achica solo el caso de cinco y solo de 1025 para arriba, que es donde
   conviven en una fila. Con icono de 32, relleno de 12 y dato de 13px el numero
   entra con margen y el dato sigue siendo mas grande que el nombre, que es la
   jerarquia que pide el diseno. Abajo de 1025 las fichas van a 2 o 1 columna,
   sobra ancho, y esta rama no aplica: por eso vive dentro de la consulta y no
   necesita repetirse en los breakpoints de abajo. */
@media (min-width: 1280px) {
  ul.kadima-icons.kadima-cert__rec:has(> .kadima-cert__field:nth-child(5)) > .kadima-cert__field {
    grid-template-columns: 32px minmax(0, 1fr);
    gap: 10px;
    padding: 12px;
  }
  ul.kadima-icons.kadima-cert__rec:has(> .kadima-cert__field:nth-child(5)) .kadima-ico {
    width: 32px; height: 32px;
  }
  ul.kadima-icons.kadima-cert__rec:has(> .kadima-cert__field:nth-child(5))
    .kadima-cert__data:has(> .kadima-cert__key) > .kadima-cert__val {
    font-size: 13px;
  }
}

/* El corte de una fila a dos columnas cae en 1279 y NO en el 1024 del resto
   del sitio. Es la misma decision medida que ya traia el pliego de la chapa:
   entre 1025 y 1279 el contenedor se angosta pero las fichas siguen en una
   fila, y ahi el numero de condado deja de entrar. Medido a 1100: la columna
   de texto baja a 156px en las de cuatro y a 125px en la home, contra los
   168px que pide "#WC-39446-H20-25". Bajarlo a 1024 reintroduce el desborde,
   ya pasado una vez. */
@media (max-width: 1279px) {
  ul.kadima-icons.kadima-cert__rec {
    grid-auto-flow: row;
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 560px) {
  ul.kadima-icons.kadima-cert__rec {
    grid-auto-flow: row;
    grid-template-columns: minmax(0, 1fr);
  }
  .kadima-cert { padding: 14px; }
}

/* ---------- 4H.8 La banda sobre seccion navy ----------
   Las 9 paginas con kadima-icons--invert tienen la seccion pintada de
   #1A2B4A, el mismo ink que la banda usa de base, asi que la banda se funde
   con el fondo. Medido con getComputedStyle en las 20 paginas: --invert va
   siempre con seccion rgb(26,43,74) y sin --invert siempre con rgb(255,255,255).

   Separacion de la banda contra su propio fondo, sin esta regla:
     sobre blanco   7.0 a 14.1 : 1
     sobre navy     1.0 a  2.0 : 1

   El filo de 1px en bronce da 3.75:1 contra el navy de la seccion, arriba del
   3 que WCAG pide para objeto grafico. Ningun breakpoint toca box-shadow sobre
   .kadima-cert, asi que esta rama no necesita repetirse en ninguno. */
.kadima-cert:has(> ul.kadima-icons--invert) {
  box-shadow:
    0 0 0 1px var(--e-global-color-accent),
    0 22px 48px -28px rgba(8, 14, 26, .75);
}

/* ============================================================
   Pase 4J: la tarjeta de servicio. Ficha tecnica con foto.

   Reporte del cliente: "todas esas cajas se ven horrible, debe verse mas
   acoplado al diseno, por ejemplo cajas mas grandes porque son servicios y con
   sus fotos y botones para cada servicio".

   Hoy cada servicio es un chip de 61px de alto. Pasa a ser una ficha de catalogo
   de unos 320px: numeral, foto con velo navy, nombre, boton.

   El orden de lectura es el de una ficha tecnica, no el de un poster: manda el
   dato (numeral, nombre, accion) y la foto acompana. Por eso la foto ocupa el
   tercio de arriba y no el fondo entero de la tarjeta, y por eso NINGUN texto
   cae sobre la foto salvo el numeral, que va sobre plancha navy medida.

   Ninguna regla de este bloque usa la pseudo-clase de contenido (la que empieza
   con dos puntos y lleva has entre parentesis), asi que no hay ninguna pareja
   que repetir dentro de los breakpoints.
   ============================================================ */

/* ---------- 4J.1 La franja: los <li> se disuelven, las fichas se deslizan ----------
   El mosaico vive repartido en dos o tres <li>, con 2, 3 o 4 fichas cada uno
   segun la pagina, porque cada <li> es una frase del copy y las comas que las
   separan son texto visible. display: contents disuelve la caja del <li> y sus
   fichas pasan a ser items de esta franja. El <li> sigue en el DOM con su texto
   intacto.

   Los separadores tambien pasan a ser hijos, y no ocupan pista porque ya vienen
   con position: absolute de 4F.7b. La posicion relativa de aca es la que los
   ancla; no crea contexto de apilamiento porque no lleva z-index.

   NO es un carrusel: no hay JavaScript, nada avanza solo y nada se mueve en
   bucle. Es scroll nativo del navegador con puntos de anclaje, o sea que la
   rueda, el gesto tactil, la barra y el tabulador lo mueven igual.

   grid-auto-flow: column pone todas las fichas en una sola pista sin que la
   hoja tenga que contar cuantas son: 8 en cuatro paginas, 7 en dos, 6 en una.

   El relleno de arriba y los lados no es decorativo: overflow-x recorta tambien
   el eje Y (cuando un eje deja de ser visible, el otro deja de serlo tambien),
   y sin ese aire el anillo de foco de la ficha, que sale 2px hacia afuera, se
   comeria contra el borde de la franja. */
/* LA FRANJA SOLO DONDE EL MOSAICO ES PURO.
   Tres de las siete paginas (about, queens, westchester) mezclan fichas con
   FILAS DESCRIPTIVAS: un <li class="kadima-linkrows__row"> que no es una ficha
   sino una frase, "Bathroom remodeling, our most requested work". Prosa adentro
   de una franja horizontal no entra: medido en /about/, la fila quedaba de
   260x313 como si fuera una tarjeta y, peor, el snap mandatory saltaba el
   primer punto de anclaje y dejaba la franja en scrollLeft 284, o sea la fila
   entera en left -159: FUERA DE VISTA al cargar, con su enlace a
   /bathroom-remodeling/ invisible. Contenido perdido, no solo apretado.

   Por eso la franja se condiciona a que NO haya filas descriptivas, y las tres
   paginas mixtas se quedan con la grilla del contrato, que resuelve ese caso de
   entrada: la fila cruza las 4 columnas y las fichas siguen corridas.
   Las dos ramas se repiten enteras en cada breakpoint de 4J.7, porque una media
   query no suma especificidad y la base les ganaria. */
ul.kadima-linkrows.kadima-linkrows--cards:not(:has(> li.kadima-linkrows__row)) {
  position: relative;
  display: grid;
  grid-auto-flow: column;
  /* none es imprescindible, no es un default escrito de mas: .kadima-linkrows
     trae un grid-template-columns propio de 4F.7 y esta cadena solo lo tapa si
     lo dice. Sin esto queda UNA pista explicita, la primera ficha cae adentro
     y colapsa: medido a 390, las pistas daban "0px 212px 212px..." y la ficha
     1 media 2px de ancho. */
  grid-template-columns: none;
  grid-auto-columns: 260px;
  gap: var(--k-gap);
  align-items: stretch;
  counter-reset: kficha;
  margin: 0;
  padding: 5px 5px 16px;
  list-style: none;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scroll-padding-left: 5px;
}
ul.kadima-linkrows--cards:not(:has(> li.kadima-linkrows__row)) .kadima-svcard {
  scroll-snap-align: start;
}
/* La rama en grilla, para las paginas que mezclan fichas y prosa. Es la del
   contrato: 4 columnas y la fila descriptiva cruzando la grilla entera. */
ul.kadima-linkrows.kadima-linkrows--cards:has(> li.kadima-linkrows__row) {
  position: relative;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  grid-auto-flow: row;
  gap: var(--k-gap);
  align-items: stretch;
  counter-reset: kficha;
  overflow: visible;
}
ul.kadima-linkrows.kadima-linkrows--cards:has(> li.kadima-linkrows__row) > li.kadima-linkrows__row {
  grid-column: 1 / -1;
}
ul.kadima-linkrows.kadima-linkrows--cards > li:not(.kadima-linkrows__row) {
  display: contents;
}

/* ---------- 4J.2 La ficha ----------
   Hereda .kadima-tile, asi que hereda tambien la entrada al scroll de 4G.4 y su
   apagado con prefers-reduced-motion. Lo que sigue anula la geometria del chip:
   el chip era inline-grid de 22px + texto, centrado y con padding propio. */
ul.kadima-linkrows--cards .kadima-svcard {
  position: relative;
  isolation: isolate;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: auto minmax(0, 1fr);
  align-items: stretch;
  gap: 0;
  width: auto;
  padding: 0;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-top: 3px solid var(--e-global-color-accent);
  counter-increment: kficha;
}

/* ---------- 4J.3 La foto ----------
   La imagen sale del flujo. Si queda dentro, sus 1072px de alto intrinseco
   entran en el calculo de la fila y la tarjeta crece sin motivo; es el defecto
   ya documentado del hero, y min-height: 0 no lo arregla porque no cambia lo que
   el item aporta. Con la foto absoluta, la caja la fija aspect-ratio y el recorte
   lo hace object-fit. */
ul.kadima-linkrows--cards .kadima-svcard__shot {
  position: relative;
  display: block;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background: var(--e-global-color-ink);
}
ul.kadima-linkrows--cards .kadima-svcard__shot > img {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
}
/* El velo navy, la firma del hero. Aca cumple dos funciones: unifica ocho fotos
   de origen distinto en una sola paleta, y baja el registro documental de la
   imagen, que es lo que hay que hacer con una foto que no es obra propia.
   Oscuro abajo, donde apoya el numeral, y casi limpio en la franja media, para
   que el ambiente se siga leyendo. */
ul.kadima-linkrows--cards .kadima-svcard__shot::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg,
    rgba(26, 43, 74, .42) 0%,
    rgba(26, 43, 74, .14) 38%,
    rgba(26, 43, 74, .30) 72%,
    rgba(26, 43, 74, .62) 100%);
}
/* El numeral. Es el unico texto que cae sobre la foto y por eso no se apoya en
   el gradiente sino en una plancha navy al 92%: contra una foto blanca pura, el
   peor caso posible, la plancha compone #2C3C58 y el cream da 10.44:1.
   Es contenido generado, o sea que no toca el DOM y la linea base de texto no
   se entera. El bronce no entra aca: sobre navy da 3.75:1 y esto es texto. */
ul.kadima-linkrows--cards .kadima-svcard__shot::after {
  content: counter(kficha, decimal-leading-zero);
  position: absolute;
  left: 0;
  bottom: 0;
  z-index: 2;
  padding: 7px 12px 6px;
  background: rgba(26, 43, 74, .92);
  color: var(--e-global-color-bg);
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: .08em;
  font-variant-numeric: tabular-nums;
}

/* ---------- 4J.4 La plancha de datos ----------
   Dos filas: el nombre arriba, el boton abajo pegado al piso de la tarjeta. Con
   la fila 2 en 1fr y align-self: end, los botones de una misma fila quedan a la
   misma altura aunque un nombre ocupe dos renglones y el de al lado uno. */
ul.kadima-linkrows--cards .kadima-svcard__body {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  grid-template-rows: auto minmax(0, 1fr);
  column-gap: 12px;
  row-gap: 16px;
  padding: 18px 20px 20px;
}
ul.kadima-linkrows--cards .kadima-svcard__body > .kadima-ico {
  grid-column: 1;
  grid-row: 1;
  width: 22px;
  height: 22px;
  flex-basis: 22px;
  margin-top: 2px;
  color: var(--e-global-color-accent-text);
}
ul.kadima-linkrows--cards .kadima-svcard__name {
  grid-column: 2;
  grid-row: 1;
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 19px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--e-global-color-ink);
}
/* El enlace pierde el subrayado bronce del chip: dentro de una ficha con boton,
   el nombre es titulo y no accion. Y se anula el subrayado animado de 4G.4 por
   si la cadena de .kadima-prose lo alcanza. */
ul.kadima-linkrows--cards .kadima-svcard__name a {
  color: var(--e-global-color-ink);
  font-weight: 600;
  text-decoration: none;
  background-image: none;
  padding-bottom: 0;
}

/* ---------- 4J.5 El boton, y por que no es un segundo enlace ----------
   La tarjeta entera es el destino: el <a> que ya existia extiende una capa
   transparente sobre toda la ficha. Asi la pagina no gana un enlace duplicado al
   mismo destino, el texto de ancla sigue siendo exactamente el nombre del
   servicio, y hay una sola parada de teclado por tarjeta en vez de dos.
   El boton es un <span>, aria-hidden, porque no aporta nada al nombre accesible
   del enlace: es la senal visual de que la ficha se toca. */
ul.kadima-linkrows--cards .kadima-svcard__name a::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
}
ul.kadima-linkrows--cards .kadima-svcard__cta {
  grid-column: 1 / -1;
  grid-row: 2;
  align-self: end;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  min-height: 44px;
  padding: 10px 16px;
  background: transparent;
  border: 1.5px solid var(--e-global-color-ink);
  color: var(--e-global-color-ink);
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: .01em;
}
/* La punta de flecha se dibuja con dos bordes, como la de la FAQ. No es un
   caracter, asi que no agrega texto en ningun lado. */
ul.kadima-linkrows--cards .kadima-svcard__cta::after {
  content: "";
  flex: 0 0 8px;
  width: 8px;
  height: 8px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(-45deg);
}

/* ---------- 4J.6 Estados ----------
   Los tres caminos llevan al mismo lugar: mouse encima, foco de teclado dentro,
   y el toque, que dispara :hover un instante antes de navegar. Nada queda
   escondido detras de un hover: en reposo ya estan la foto, el numeral, el
   nombre y el boton. Lo que cambia es el relleno del boton y el filo. */
ul.kadima-linkrows--cards .kadima-svcard:hover,
ul.kadima-linkrows--cards .kadima-svcard:focus-within {
  border-color: var(--e-global-color-accent);
}
ul.kadima-linkrows--cards .kadima-svcard:hover .kadima-svcard__cta,
ul.kadima-linkrows--cards .kadima-svcard:focus-within .kadima-svcard__cta {
  background: var(--e-global-color-ink);
  border-color: var(--e-global-color-ink);
  color: var(--e-global-color-bg);
}
/* El anillo de foco se dibuja sobre la capa transparente, que mide lo mismo que
   la tarjeta: el borde queda alrededor de la ficha entera y no alrededor de las
   dos palabras del nombre. Nada recorta ese anillo porque overflow: hidden vive
   en la foto, no en la tarjeta. */
ul.kadima-linkrows--cards .kadima-svcard__name a:focus-visible {
  outline: none;
}
ul.kadima-linkrows--cards .kadima-svcard__name a:focus-visible::after {
  outline: 3px solid var(--e-global-color-accent-text);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: no-preference) {
  ul.kadima-linkrows--cards .kadima-svcard {
    transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;
  }
  ul.kadima-linkrows--cards .kadima-svcard__cta {
    transition: background-color .18s ease, color .18s ease, border-color .18s ease;
  }
  ul.kadima-linkrows--cards .kadima-svcard__shot > img {
    transition: transform .5s cubic-bezier(.2, .6, .2, 1);
  }
  ul.kadima-linkrows--cards .kadima-svcard:hover,
  ul.kadima-linkrows--cards .kadima-svcard:focus-within {
    transform: translateY(-3px);
    box-shadow: 0 12px 28px rgba(26, 43, 74, .12);
  }
  ul.kadima-linkrows--cards .kadima-svcard:hover .kadima-svcard__shot > img,
  ul.kadima-linkrows--cards .kadima-svcard:focus-within .kadima-svcard__shot > img {
    transform: scale(1.05);
  }
  /* Escalonado de la entrada al scroll. Va por animation-range y no por
     animation-delay: sobre una linea de tiempo de scroll el delay en segundos se
     ignora, asi que el escalonado hay que correrlo en el rango. Las fichas son
     los hijos impares del <li>, porque entre una y otra vive el separador. */
  @supports (animation-timeline: view()) {
    ul.kadima-linkrows--cards .kadima-svcard:nth-child(3) { animation-range: entry 4% entry 44%; }
    ul.kadima-linkrows--cards .kadima-svcard:nth-child(5) { animation-range: entry 8% entry 48%; }
    ul.kadima-linkrows--cards .kadima-svcard:nth-child(7) { animation-range: entry 12% entry 52%; }
  }
}
@media (prefers-reduced-motion: reduce) {
  ul.kadima-linkrows--cards .kadima-svcard,
  ul.kadima-linkrows--cards .kadima-svcard:hover,
  ul.kadima-linkrows--cards .kadima-svcard:focus-within {
    transition: none;
    transform: none;
  }
  ul.kadima-linkrows--cards .kadima-svcard__shot > img {
    transition: none;
    transform: none;
  }
}

/* ---------- 4J.7 Breakpoints ----------
   La franja no cambia de forma al angostarse: se desliza igual en escritorio y
   en telefono, que es lo que pide el diseno aprobado. Lo unico que baja es el
   ancho de pista, y con el la ficha.

   La ficha NO se acuesta debajo de 560 como hacia la version en grilla. Ahi
   tenia sentido, porque una columna de ocho tarjetas verticales daba unos
   2900px de scroll vertical; en una franja horizontal el alto no depende de
   cuantas fichas haya, asi que la ficha se queda de pie y solo se angosta. */
@media (max-width: 1024px) {
  ul.kadima-linkrows.kadima-linkrows--cards { gap: 20px; }
  ul.kadima-linkrows.kadima-linkrows--cards:has(> li.kadima-linkrows__row) {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}
/* La rama en grilla pasa a dos columnas en 900 y no en 767: con tres, un
   viewport de 768 deja la ficha en 222px y el nombre de dos palabras ocupa tres
   renglones. Es la medicion del contrato. */
@media (max-width: 900px) {
  ul.kadima-linkrows.kadima-linkrows--cards:has(> li.kadima-linkrows__row) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 767px) {
  ul.kadima-linkrows.kadima-linkrows--cards:not(:has(> li.kadima-linkrows__row)) {
    grid-auto-columns: 232px;
    gap: 16px;
  }
  ul.kadima-linkrows.kadima-linkrows--cards:has(> li.kadima-linkrows__row) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 16px;
  }
  ul.kadima-linkrows--cards .kadima-svcard__shot { aspect-ratio: 4 / 3; }
  ul.kadima-linkrows--cards .kadima-svcard__body { padding: 16px; row-gap: 14px; column-gap: 10px; }
  ul.kadima-linkrows--cards .kadima-svcard__name { font-size: 18px; }
}
@media (max-width: 560px) {
  ul.kadima-linkrows.kadima-linkrows--cards:not(:has(> li.kadima-linkrows__row)) {
    grid-auto-columns: 212px;
    gap: 14px;
  }
  ul.kadima-linkrows.kadima-linkrows--cards:has(> li.kadima-linkrows__row) {
    grid-template-columns: minmax(0, 1fr);
    gap: 14px;
  }
  ul.kadima-linkrows--cards .kadima-svcard__body { padding: 14px 16px; row-gap: 12px; }
  ul.kadima-linkrows--cards .kadima-svcard__name { font-size: 17px; }
  ul.kadima-linkrows--cards .kadima-svcard__cta { padding: 10px 14px; font-size: 14px; }
}

/* ---------- 4J.8 Defecto previo de la fila descriptiva, medido ----------
   No lo introduce esta tarjeta: esta hoy en produccion. La fila descriptiva es
   una grilla de dos columnas, 24px para el icono y el resto para el texto, pero
   el <li> tiene TRES hijos: el icono, el <strong> del enlace, y el texto suelto
   que sigue a la coma. Ese texto suelto es un item anonimo de grilla y cae en la
   celda 3, o sea la fila 2 columna 1, que mide 24px de ancho.

   Medido con el kit actual y sin nada de este pase, a 1440 en /about/:
   la fila da 217px de alto y ", our most requested work" baja en columna, una
   palabra por renglon, dentro del carril del icono.

   Afecta 13 filas: about 1, queens 1, westchester 6, bronxville 5.

   La fila vuelve a ser un bloque de texto corrido y el icono pasa a inline. La
   cadena arranca en .kadima-linkrows-wrap para medir (0,3,2) y ganarle a la
   regla de 4F.7b sin depender del orden del archivo. */
.kadima-linkrows-wrap ul.kadima-linkrows > li.kadima-linkrows__row {
  display: block;
  padding: 20px 24px;
}
.kadima-linkrows-wrap ul.kadima-linkrows > li.kadima-linkrows__row > .kadima-ico {
  display: inline-block;
  vertical-align: -5px;
  margin: 0 10px 0 0;
}
@media (max-width: 767px) {
  .kadima-linkrows-wrap ul.kadima-linkrows > li.kadima-linkrows__row { padding: 16px; }
}


/* ============================================================
   4K  LOS CUATRO PASOS. "Our 4 Easy Steps Towards Your Project".

   Seccion nueva, aprobada por el cliente, en /about/ y en la home.

   OJO CON EL NOMBRE. Las clases son kadima-easystep*, NO kadima-step*. Ese
   nombre ya esta tomado: .kadima-steps y .kadima-step son el componente de
   pasos que ya vive en la home y en 8 paginas de servicio, con 17 reglas
   repartidas por el kit. La primera version de este bloque las reuso sin
   querer y no solo no renderizaba (heredaba display: grid y una grilla de dos
   carriles), sino que desplegada habria redefinido padding, borde y columnas
   del componente viejo en esas 9 paginas.
   Layout editorial de tres carriles: el numeral a la izquierda, el texto en el
   medio y la foto a la derecha, con un filete vertical que hilvana los pasos y
   un separador entre uno y otro.

   El numeral sale de un contador CSS y no del DOM, igual que en 4H y 4J. Aca
   la seccion entera es texto nuevo, asi que no cambia nada para la invariante,
   pero se mantiene el patron de la casa: un <ol> ya anuncia la posicion a un
   lector de pantalla, y repetir el numero en el markup lo haria decirlo dos
   veces.

   CONTRASTE, medido con la formula de WCAG sobre los dos fondos de seccion
   que usa el sitio:
                              blanco   cream    umbral
     titulo navy 17px/600     14.11    13.30    4.5    PASA
     descripcion gris 13.5px   5.95     5.61    4.5    PASA
     tag bronce oscuro         5.21     4.91    4.5    PASA
     numeral bronce 38px       3.77     3.55    3      PASA
   El numeral es el unico que no llegaria a 4.5, y no le corresponde: 38px es
   texto grande para WCAG (>=24px normal), asi que su umbral es 3. Por eso el
   numeral puede ser bronce y los tags usan el bronce OSCURO --e-global-color-
   accent-text, que a 12px si tiene que pasar 4.5.
   ============================================================ */

/* ---------- 4K.1 La lista ---------- */
.kadima-easysteps { width: 100%; }
ol.kadima-easysteps__list {
  list-style: none;
  margin: 0;
  padding: 0;
  counter-reset: kpaso;
}

/* ---------- 4K.2 El paso ----------
   Tres carriles fijos: 64px para el numeral, el resto para el texto y 180px
   para la foto. El relleno de abajo y el separador hacen el ritmo vertical. */
ol.kadima-easysteps__list > .kadima-easystep {
  position: relative;
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr) 180px;
  align-items: start;
  column-gap: 24px;
  padding: 26px 0;
  border-bottom: 1px solid var(--e-global-color-border);
  counter-increment: kpaso;
}
ol.kadima-easysteps__list > .kadima-easystep:first-child { padding-top: 0; }
ol.kadima-easysteps__list > .kadima-easystep:last-child { border-bottom: 0; padding-bottom: 0; }

/* El numeral. Playfair, que es la tipografia de titulo del sitio. */
ol.kadima-easysteps__list > .kadima-easystep::before {
  content: counter(kpaso);
  grid-column: 1;
  grid-row: 1;
  font-family: var(--e-global-typography-primary-font-family), Georgia, serif;
  font-size: 38px;
  font-weight: 600;
  line-height: 1;
  color: var(--e-global-color-accent);
  font-variant-numeric: lining-nums tabular-nums;
}
/* El filete vertical que hilvana los pasos. Arranca debajo del numeral y llega
   al borde de abajo. No lo lleva el ultimo: no hay nada que hilvanar. */
ol.kadima-easysteps__list > .kadima-easystep::after {
  content: "";
  position: absolute;
  left: 19px;
  top: 52px;
  bottom: 0;
  width: 1px;
  background: var(--e-global-color-border);
}
ol.kadima-easysteps__list > .kadima-easystep:first-child::after { top: 46px; }
ol.kadima-easysteps__list > .kadima-easystep:last-child::after { display: none; }

/* ---------- 4K.3 El texto ---------- */
.kadima-easystep__body { grid-column: 2; grid-row: 1; min-width: 0; }
/* La cadena es larga a proposito y no por costumbre. El titulo es un <h3> y el
   sitio tiene una regla responsive que le gana a cualquier cadena corta:

     [data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h3
       font-size: clamp(18px, 1.4vw, 22px)

   mide (0,3,1) y a 1440 resuelve 20.16px, que es lo que salia medido en vez de
   los 17 pedidos. Preguntado al navegador con getMatchedStylesForNode, no
   deducido: la primera sospecha fue .elementor-kit-5 h3, que tambien pierde
   contra esa y no era la culpable. Esta cadena mide (0,4,0) y le gana por
   cantidad de clases, sin depender del orden del archivo. */
[data-elementor-type="wp-page"] > .e-con .kadima-easysteps .kadima-easystep__title {
  margin: 0 0 8px;
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 17px;
  font-weight: 600;
  line-height: 1.35;
  color: var(--e-global-color-ink);
}
.kadima-easystep__desc,
.kadima-easystep__sub {
  margin: 0;
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 13.5px;
  line-height: 1.65;
  color: var(--e-global-color-muted);
}
.kadima-easystep__sub { margin-top: 10px; }

/* ---------- 4K.4 Los tags ----------
   Sub-puntos del paso. Bronce OSCURO y no el bronce del numeral: a 12px esto
   es texto chico y tiene que pasar 4.5, cosa que el bronce comun no hace. */
ul.kadima-easystep__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 14px;
  margin: 12px 0 0;
  padding: 0;
  list-style: none;
}
ul.kadima-easystep__tags > .kadima-easystep__tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .02em;
  color: var(--e-global-color-accent-text);
}
ul.kadima-easystep__tags .kadima-ico {
  width: 15px;
  height: 15px;
  flex: none;
  stroke-width: 1.6;
}

/* La variante con detalle: el paso 4 no tiene descripcion propia, su contenido
   SON los cinco puntos, cada uno con su texto. Deja de ser una fila de
   etiquetas y pasa a ser una lista vertical: icono y etiqueta en el primer
   renglon, el texto debajo y alineado con la etiqueta, no con el icono.
   La clase la pone el compositor segun la forma del dato, asi el CSS no cuenta
   hijos ni tiene que saber en que paso esta. */
ul.kadima-easystep__tags--detalle {
  flex-direction: column;
  gap: 12px;
  margin-top: 14px;
}
ul.kadima-easystep__tags--detalle > .kadima-easystep__tag {
  display: grid;
  grid-template-columns: 15px minmax(0, 1fr);
  align-items: start;
  column-gap: 8px;
  row-gap: 3px;
}
ul.kadima-easystep__tags--detalle .kadima-ico { grid-column: 1; grid-row: 1; margin-top: 2px; }
ul.kadima-easystep__tags--detalle .kadima-easystep__taglabel { grid-column: 2; grid-row: 1; }
.kadima-easystep__tagsub {
  grid-column: 2;
  grid-row: 2;
  font-size: 13px;
  font-weight: 400;
  letter-spacing: 0;
  line-height: 1.6;
  color: var(--e-global-color-muted);
}

/* ---------- 4K.5 La foto ----------
   Decorativa: alt vacio y nunca se presenta como obra de Kadima. */
.kadima-easystep__shot {
  grid-column: 3;
  grid-row: 1;
  width: 180px;
  height: 120px;
  overflow: hidden;
  border-radius: 4px;
  background: var(--e-global-color-border);
}
.kadima-easystep__shot > img {
  display: block;
  width: 100%;
  height: 100%;
  max-width: 100%;
  object-fit: cover;
}

/* ---------- 4K.6 Movimiento ----------
   Se anula la entrada de 4G.4 sobre el paso y se pasa a la seccion entera: con
   cuatro filas altas, escalonarlas una por una se lee como parpadeo. Ademas un
   fill "both" congelaria transform y cualquier desplazamiento futuro quedaria
   muerto, que es lo que ya paso en 4H. */
ol.kadima-easysteps__list > .kadima-easystep { animation: none; }

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .kadima-easysteps {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 40%;
    }
  }
}

/* ---------- 4K.7 Breakpoints ----------
   La foto baja debajo del texto y queda una sola columna de contenido. El
   numeral se queda en su carril: es lo que da la lectura de "paso 2 de 4" y
   sacarlo dejaria cuatro bloques sin orden aparente. */
@media (max-width: 767px) {
  ol.kadima-easysteps__list > .kadima-easystep {
    grid-template-columns: 48px minmax(0, 1fr);
    column-gap: 16px;
    padding: 22px 0;
  }
  ol.kadima-easysteps__list > .kadima-easystep::before { font-size: 30px; }
  ol.kadima-easysteps__list > .kadima-easystep::after { left: 15px; top: 42px; }
  ol.kadima-easysteps__list > .kadima-easystep:first-child::after { top: 38px; }
  .kadima-easystep__shot {
    grid-column: 2;
    grid-row: 2;
    width: 100%;
    height: 150px;
    margin-top: 14px;
  }
}
@media (max-width: 480px) {
  .kadima-easystep__shot { height: 130px; }
  ol.kadima-easysteps__list > .kadima-easystep::before { font-size: 26px; }
}

/* ============================================================
   4I.5 kadima-prose huerfano pierde su centrado al compartir wrapper
   ============================================================
   Tarea 3, 2026-08-26. Sintoma reportado: parrafos de prosa que se ven
   pegados al borde izquierdo de su contenedor, con un hueco vacio grande a
   la derecha. Barrido con CDP en las 26 paginas midiendo el hueco izquierdo
   y derecho de cada .kadima-prose contra su .e-con-inner: el defecto real
   (hueco asimetrico, izq=0) aparece en exactamente dos secciones, ambas en
   la home: "What We Build" y "Licensed, Insured, Accountable". El resto de
   apariciones de .kadima-prose en el sitio (kadima-steps, kadima-claims,
   kadima-splitband, kadima-mark-area, kadima-mark-cta, y bare .kadima-prose
   suelto como CTA de cierre) ya miden simetrico: no es un problema general
   de la tipografia larga, es un caso puntual.

   Causa, confirmada comparando los ajustes de Elementor de los cuatro
   widgets involucrados (identicos byte a byte, esto no es un ajuste por
   widget) contra el CSS: en "What We Build" y "Licensed..." el widget HTML
   unico contiene DOS bloques hermanos, el .kadima-prose de entrada y a
   continuacion un componente de ancho completo (.kadima-subservices o
   .kadima-badges). La regla de la linea 206 (".e-con-inner > .elementor-widget
   :has(> .kadima-subservices)", igual para kadima-badges) estira TODO el
   wrapper del widget a width: 100% para que ese segundo componente ocupe el
   ancho del contenedor, que es lo que necesita. Pero como :has() estira el
   WRAPPER completo y no solo el hijo que lo dispara, el .kadima-prose
   hermano, con max-width: 720px y margin: 0, queda flotando contra el borde
   izquierdo de un wrapper ahora mas ancho que su propio contenido en vez de
   quedar centrado en el.

   Donde .kadima-prose es el UNICO contenido del widget (Where We Work,
   Ready to Start, los CTA de cierre de cada pagina de servicio) nadie mas
   estira su wrapper, asi que el align-items: center de Elementor lo centra
   de fabrica. Por eso esos casos ya se veian bien.

   Arreglo: margin auto en el .kadima-prose base, para que se centre en su
   wrapper sin importar cuanto mida ese wrapper. Ensayado con CDP inyectando
   esta regla en vivo y remidiendo las 26 paginas antes/despues: los unicos
   dos casos que cambian son los dos rotos (pasan a izq=der=240 a 1440px, o
   sea centrados), y ningun otro .kadima-prose del sitio se mueve un pixel,
   porque los combos ya fijan su propio max-width (kadima-claims, kadima-
   splitband: max-width: none, sin margen que repartir) o ya traen su propio
   margin auto (kadima-mark-cta, linea 922, queda redundante pero identico). */
.kadima-prose {
  margin-left: auto;
  margin-right: auto;
}

/* ============================================================
   4M. Footer: layout mas prolijo (Tarea 4, 2026-08-26)
   ============================================================
   Hallazgo antes de tocar nada: el footer (post 40, template de Theme
   Builder) YA tenia CSS propio, pero no vive en este archivo. Vive en el
   campo de Custom CSS de sus propios widgets/contenedores, compilado aparte
   en post-40.css (bronce en los titulos de columna, el filete y padding de
   Popular Service & Area Combinations, el tamano de kadima-cta-text, etc).
   Este archivo (post 5, el kit) SOLO tenia un bloque .kadima-footer__* de
   una version anterior del markup, que ya no existe (columnas de la home
   se llamaban distinto). Ese bloque quedo huerfano, no aplica a nada, y se
   deja como esta: tocarlo no es parte de esta tarea y no cambia nada visible.

   Orden de carga real, medido en el <head> de la home: post-5 (el kit),
   post-92 (la pagina), post-38 (header), post-40 (footer) al final. O sea
   que post-40 carga DESPUES del kit, y a igual especificidad post-40 gana
   por ser mas tardio. Todas las reglas de aca abajo llevan [data-elementor-
   type="footer"] adelante para tener mas especificidad que las de post-40 y
   ganar de forma determinista sin !important, mismo criterio que el resto
   del archivo usa contra el CSS de pagina (linea 827).

   Un contenedor de Elementor expone su borde en DOS canales a la vez: la
   propiedad literal (border-width, que post-40 fija en 1px) y la custom
   property que el motor de Elementor consume (--border-top-width, que
   tambien hay que poner en 0). Pisar solo la propiedad literal no alcanza:
   medido en vivo con CDP, el borde volvia a 1px de forma intermitente hasta
   pisar los dos canales juntos. Vale para cualquier borde/radio/padding de
   un contenedor de Elementor, no es particular de este footer.

   Sin cambios de markup (el footer es template de Theme Builder, post 40).
   Sin cambiar contenido ni links, solo layout:
   - Las 4 columnas: mas separacion entre filas en el quiebre a 2 columnas
     de 1024px, donde NAP y Servicios (de alturas distintas) dejaban un
     salto que se leia como desalineado en vez de intencional.
   - NAP: un filete antes del copyright cierra el bloque de contacto y
     licencias como una unidad. El texto sigue en ink, 15px, sin atenuar
     (post-40 linea 5-7, Decision 09.4, no se toca).
   - Popular Service & Area Combinations: los links sueltos en fila pasan a
     chips con borde y esquinas redondeadas, para que se lean como un bloque
     y no como un parrafo de links perdido.
   - CTA final: banda navy contenida, mismo lenguaje visual que kadima-mark-
     cta en el cuerpo de las paginas (linea 884), para que cierre el footer
     con mas peso que el resto de la seccion.

   Nota aparte, no es parte de esta tarea: se detecto que --k-tint (linea
   960) esta rota en produccion. Su version con color-mix() referencia
   --e-global-color-accent, que Elementor solo expone en el scope de
   .elementor-kit-5 (el body), no en :root. Como el @supports que la define
   corre en :root, el color-mix() queda invalido ahi mismo y ese invalido se
   hereda a todo el documento: cualquier elemento que use var(--k-tint) sin
   fijar su propio valor recibe fondo transparente en vez de la crema
   esperada. Confirmado con CDP: --k-tint se lee vacio en cualquier
   elemento del sitio. Hoy solo hay un uso real (linea 1327); no se toca
   aca porque cambiar :root afecta a las 26 paginas y merece su propio
   ensayo y verificacion, no un efecto colateral de esta tarea. Documentado
   en TRASPASO.md. */
[data-elementor-type="footer"] .e-con.e-grid:has(.kadima-nap) {
  row-gap: 48px;
}
[data-elementor-type="footer"] .kadima-nap .kadima-copy {
  padding-top: 16px;
  border-top: 1px solid var(--e-global-color-border);
}
[data-elementor-type="footer"] .kadima-nap-name {
  font-size: 17px;
}
[data-elementor-type="footer"] .kadima-combos.kadima-combos {
  margin-top: 8px;
  padding: 28px 24px 24px;
  border-top: 1px solid var(--e-global-color-border);
}
[data-elementor-type="footer"] .kadima-combos .kadima-foot-h {
  margin-bottom: 16px;
}
[data-elementor-type="footer"] .kadima-combos ul {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
[data-elementor-type="footer"] .kadima-combos li {
  margin: 0;
}
[data-elementor-type="footer"] .kadima-combos li a {
  display: inline-flex;
  align-items: center;
  padding: 8px 16px;
  min-height: 0;
  font-size: 14px;
  line-height: 1.3;
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-radius: 999px;
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) {
  --padding-top: 36px;
  --padding-bottom: 36px;
  --padding-left: 32px;
  --padding-right: 32px;
  margin-top: 8px;
  background-color: var(--e-global-color-ink);
  --border-top-width: 0px;
  --border-right-width: 0px;
  --border-bottom-width: 0px;
  --border-left-width: 0px;
  --border-style: none;
  --border-color: transparent;
  border-width: 0;
  border-style: none;
  border-color: transparent;
  border-radius: 8px;
  gap: 20px 28px;
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .kadima-cta-text {
  color: var(--e-global-color-bg);
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) a.kadima-phone {
  color: var(--e-global-color-bg);
  border-bottom-color: var(--e-global-color-accent);
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .elementor-widget-button .elementor-button {
  background-color: var(--e-global-color-accent);
  color: var(--e-global-color-ink);
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .elementor-widget-button .elementor-button:hover,
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .elementor-widget-button .elementor-button:focus-visible {
  background-color: var(--e-global-color-bg);
  color: var(--e-global-color-ink);
}

/* ============================================================
   4N. Header: arregla el desborde horizontal en el rango tablet (Tarea 5)
   ============================================================
   Diagnostico. El desborde de 7px a 1024px que quedo anotado en el pase del
   residuo de 23px es real, y es mas grande de lo que ese numero solo sugiere:
   medido con CDP en 14 anchos de 768 a 1025px, el mismo defecto crece de
   forma continua a medida que el viewport se angosta, hasta 46px de desborde
   a 768px (el limite de abajo del rango: a 767px el header pasa al menu
   hamburguesa, que es una estructura distinta y no tiene este problema).

   Causa exacta. El boton "Get Your Estimate" del header (elementor-element-
   f7e7d29) vive en el mismo contenedor flex que el telefono. Ese contenedor
   SI se achica correctamente con flex-shrink al angostar la pantalla (medido:
   314px a 1024px, cada vez menos por debajo). Pero el <a class="elementor-
   button"> de adentro no es el item flex, es un bloque normal con white-
   space: nowrap: no se achica con su contenedor, se queda en su ancho de
   contenido (202px a font-size 16px) y ese ancho fijo es lo que se sale del
   viewport. El contenedor del boton llega a medir hasta 148px en el rango
   angosto: no hay tamano de fuente fijo que entre siempre ahi sin quedar
   ilegible, asi que la solucion correcta no es un numero magico por ancho,
   es dejar que el texto haga lo que el contenedor le pida.

   Arreglo, solo CSS, sin tocar el markup del header (Theme Builder, post 38):
   se le saca white-space: nowrap al boton y se le pone max-width: 100%, asi
   respeta el ancho que su contenedor ya le esta dando. Cuando sobra espacio
   (todo el rango de escritorio) el texto sigue en una sola linea, igual que
   siempre: max-width: 100% nunca fuerza un ancho menor al que el contenido
   pediria solo. Cuando no sobra (todo el rango 768-1025px) el texto pasa a
   dos lineas dentro del mismo boton en vez de salirse del viewport.

   [data-elementor-type="header"] adelante por la misma razon que el resto
   del archivo: post-38 carga DESPUES del kit (orden real, no alfabetico:
   post-5, post-92, post-38, post-40), y a igual especificidad gana el que
   carga despues. El id del widget scopea el cambio a este boton nada mas;
   ningun otro .elementor-button del sitio lo hereda.

   Verificado con CDP: 14 anchos de 768 a 1440px, inyectando el CSS en vivo
   antes de subir y remidiendo en la pagina real despues. Desborde 0px en
   los 14. A 1440px el boton se mide identico a antes (una sola linea, sin
   cambio visual). Probado tambien en /about/, /contact/ y una pagina de
   servicio: mismo resultado, el header es el mismo template en las 26. */
[data-elementor-type="header"] .elementor-element-f7e7d29 .elementor-button {
  max-width: 100%;
  white-space: normal;
  text-align: center;
}

/* ============================================================
   4O. Mejora visual global (pasada de 10 reglas, 2026-08-26)
   ============================================================
   Reglas 1, 2, 4b, 5, 6, 9, y una version acotada de 3 y 10. Reglas 7 y 8
   necesitan markup y van en un pase aparte (arriba de este bloque en el
   commit, o documentadas si se saltean). Cada sub-bloque cita la regla del
   pedido que resuelve. */

/* ---------- 4O.1 (Regla 6) Variables de tarjeta ----------
   No se retroactiva a kadima-svc/kadima-badge/kadima-claim/kadima-cert
   existentes: ya funcionan, ya estan verificados en produccion, y bordes a
   1px solid var(--e-global-color-border) sin radio es exactamente lo que
   tienen hoy. Cambiarlos ahi es riesgo sin beneficio visible. Las variables
   se usan en los componentes que este pase toca o crea: las tarjetas de FAQ
   (4O.3) y las tarjetas de "What We Build" con foto (aparte, con markup). */
:root {
  --k-card-border: 1px solid var(--e-global-color-border);
  --k-card-radius: 6px;
  --k-card-shadow: 0 10px 26px rgba(26, 43, 74, .10);
}

/* ---------- 4O.2 (Regla 1) Parrafo introductorio de seccion, mas ancho ----------
   Sintoma: .kadima-prose suelto (el intro corto que sigue a un H2, sin clase
   compania) mide 720px dentro de un contenedor de 1200, y aunque la Tarea 3
   ya lo centro (4I.5), sigue leyendose angosto para una linea de apertura.
   Sube a 960px. La prosa larga real (kadima-longform, y cualquier combo con
   su propio max-width ya declarado: kadima-claims, kadima-splitband, etc.)
   no la toca esta regla porque la especificidad de sus propias reglas
   (0,2,0 o mas) sigue ganando sobre este 0,1,0. */
.kadima-prose { max-width: 960px; }

/* ---------- 4O.3 (Regla 2) FAQ: tarjetas con aire, no lineas sueltas ----------
   Causa del hueco lateral: .kadima-faq no tenia regla de ancho de wrapper
   propia (a diferencia de kadima-badges/kadima-subservices/kadima-cards en
   la linea 206), asi que Elementor lo encogia a su contenido, no al
   contenedor. Medido en /faq/: 513px dentro de un .e-con-inner de 1200,
   343/344 de hueco a cada lado. Se suma a la lista de anchos completos.
   La sombra y el radio son nuevos (antes no tenia ninguno de los dos);
   el borde bronce a la izquierda y el fondo blanco ya existian (4J.1) y se
   mantienen, es lo que la distingue de kadima-svc/kadima-cert. */
.e-con-inner > .elementor-widget:has(> .kadima-faq) {
  align-self: stretch;
  width: 100%;
}
.kadima-faq {
  max-width: none;
  width: 100%;
}
.kadima-faq details {
  border-radius: var(--k-card-radius);
  box-shadow: var(--k-card-shadow);
}
@media (prefers-reduced-motion: no-preference) {
  .kadima-faq details {
    transition: box-shadow .18s ease, transform .18s ease;
  }
  .kadima-faq details:hover {
    box-shadow: 0 14px 32px rgba(26, 43, 74, .14);
  }
}

/* ---------- 4O.4 (Regla 4b) Columna de texto sobre foto, menos angosta ----------
   .kadima-sb__body (el cuerpo de kadima-splitband, la banda con foto+texto
   sobre navy) media 660px de linea de lectura contra una foto de banda
   completa: la proporcion se sentia desbalanceada. Sube a 800px. No se toco
   kadima-longform: barrido en las 26 paginas, no se encontro ninguna
   instancia de kadima-longform sobre fondo oscuro (siempre aparece en
   seccion clara, con su propio bloque .kadima-lf__lead que ya hace de
   "banda oscura" contenida). Si en el futuro aparece un kadima-longform
   sobre .kadima-bandmedia o similar, esta regla no lo cubre y hay que
   sumarlo aparte. */
.kadima-splitband .kadima-sb__body,
.kadima-splitband--flip .kadima-sb__body,
.kadima-claims .kadima-claims__list {
  max-width: 800px;
}

/* ---------- 4O.5 (Regla 5) Parrafos con mas aire ----------
   De 1em (el default del navegador) a 1.4em de margen entre parrafos, en
   prosa larga. Aplica a kadima-longform (los bloques de 4F.9) y a
   kadima-prose en general; los combos que ya fijan su propio ritmo interno
   (kadima-claims__list, kadima-sb__body con sus reglas de arriba) no tienen
   parrafos multiples sueltos, asi que no colisiona. */
.kadima-prose p + p,
.kadima-lf__lead p + p,
.kadima-lf__block p + p {
  margin-top: 1.4em;
}

/* ---------- 4O.6 (Regla 9) Animaciones de entrada: arregla el escalonado
   roto y suma los componentes que no tenian ninguna ----------
   El escalonado de kadima-claim/kadima-svc/ul.kadima-icons>li (linea 1845)
   usa animation-delay, que una animation-timeline de scroll ignora: todos
   entran juntos, no en cascada. No se borra esa regla (queda inerte, no
   rompe nada); se suma el mecanismo correcto, animation-range por
   nth-child, igual que ya usa kadima-svcard (linea 3176) para las fichas
   de "What We Do" en About. */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .kadima-claim:nth-child(2), .kadima-svc:nth-child(2), ul.kadima-icons > li:nth-child(2) {
      animation-range: entry 4% entry 44%;
    }
    .kadima-claim:nth-child(3), .kadima-svc:nth-child(3), ul.kadima-icons > li:nth-child(3) {
      animation-range: entry 8% entry 48%;
    }
    .kadima-claim:nth-child(4), .kadima-svc:nth-child(4), ul.kadima-icons > li:nth-child(4) {
      animation-range: entry 12% entry 52%;
    }
    .kadima-claim:nth-child(5), .kadima-svc:nth-child(5) {
      animation-range: entry 16% entry 56%;
    }
    .kadima-claim:nth-child(6), .kadima-svc:nth-child(6) {
      animation-range: entry 20% entry 60%;
    }
    .kadima-svc:nth-child(7) { animation-range: entry 24% entry 64%; }
    .kadima-svc:nth-child(8) { animation-range: entry 28% entry 68%; }
    .kadima-svc:nth-child(9) { animation-range: entry 32% entry 72%; }
  }

  /* kadima-badge (3 items, trust bar) y las tarjetas de FAQ no tenian
     ninguna animacion de entrada. Mismo keyframe que el resto del sitio
     (kadimaEntra, linea 1816), mismo criterio de rango que kadima-svcard.
     El opacity:0 de partida vive SOLO adentro de @supports, igual que el
     resto del archivo: la propiedad animation es la unica que lo pone, asi
     que en un navegador sin animation-timeline la regla entera se descarta
     y la pieza nunca pasa por opacity:0. No hace falta ningun salvavidas
     aparte, alcanza con no escribir opacity fuera de @supports. */
  @supports (animation-timeline: view()) {
    .kadima-badge,
    .kadima-faq details {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 40%;
    }
    .kadima-badge:nth-child(2) { animation-range: entry 4% entry 44%; }
    .kadima-badge:nth-child(3) { animation-range: entry 8% entry 48%; }
    .kadima-faq details:nth-of-type(2) { animation-range: entry 3% entry 43%; }
    .kadima-faq details:nth-of-type(3) { animation-range: entry 6% entry 46%; }
    .kadima-faq details:nth-of-type(4) { animation-range: entry 9% entry 49%; }
    .kadima-faq details:nth-of-type(5) { animation-range: entry 12% entry 52%; }
    .kadima-faq details:nth-of-type(6) { animation-range: entry 15% entry 55%; }
    .kadima-faq details:nth-of-type(n+7) { animation-range: entry 18% entry 58%; }
  }
}

/* ---------- 4O.7 (Reglas 3 y 10, version acotada) Separadores variados y
   guias visuales entre secciones ----------
   El pedido original tiene cinco ideas de separador mas "card break" con
   dato/cita en About, mas flechas/progreso entre secciones. De eso se
   implementa lo que es CSS/SVG puro y sistematico (se aplica solo por
   adyacencia de secciones, cero markup nuevo, cero contenido por
   inventar). Se documenta y se SALTEA a proposito:
     - El "card break" con dato/cita en About: necesita contenido real
       (una cifra, una frase) elegido a mano por seccion, no es una regla
       de CSS generica. Se puede armar en un pase aparte si el cliente
       elige que dato/cita va en cada corte.
     - Numeros/indicador de progreso entre secciones secuenciales: el sitio
       no tiene una secuencia narrativa unica fuera de "Our 4 Easy Steps",
       que ya tiene su propio numeral (kadima-step-n). Aplicarlo a otras
       secciones sin una secuencia real que numerar seria decorativo sin
       significado, y el pedido explicita que lo decorativo no debe
       confundir. Se saltea.

   Lo que si entra, las tres formas sistematicas:
   1. Dos secciones oscuras seguidas: filete bronce con motivo de rombo en
      el medio, marca el corte donde el fondo no cambia de tono y por eso
      no se nota solo.
   2. Una oscura seguida de clara (o al reves): gradiente de transicion en
      el borde, para que el salto de tono no sea un corte duro.
   3. El filete bronce que ya vive debajo de cada H2 de seccion
      (elementor-heading-title::after, linea 812) pasa de aparecer fijo a
      crecer desde el centro cuando la seccion entra en pantalla. Cero
      markup nuevo, es el mismo elemento de siempre con una animacion
      encima. Dobla como guia visual (Regla 10): el ojo sigue la linea que
      se dibuja hacia el titulo.
   4. Un chevron sutil al pie del hero invita a seguir bajando. Decorativo
      puro: es un ::after sin contenido semantico, no necesita aria-hidden
      porque un pseudo-elemento nunca entra al arbol de accesibilidad. */

/* -- 1. Filete con rombo entre dos secciones oscuras --
   2026-08-27, correccion: esta regla usaba ::before para dibujar la linea, en
   el MISMO elemento donde kadima-splitband/kadima-claims/kadima-bandmedia ya
   ponen su propio ::before de velo (lineas 2184 y 1429). Solo puede ganar UNA
   declaracion de background por pseudo-elemento, y esta cadena, con cinco
   :is() de cinco alternativas cada uno, media mas especificidad que la del
   velo: le ganaba el background entero, no solo el area chica de 120x1px que
   el rombo pedia. Sintoma: la banda siguiente a otra oscura (ejemplo, "Why We
   Started Kadima" justo despues de "Why Kadima Contruction") se quedaba sin
   velo, texto ilegible sobre la foto. Se acota a mark-cta y cert, los dos
   marcadores sin foto ni ::before propio: ahi el rombo no compite con nada,
   y es donde de verdad hace falta (dos secciones a navy solido, sin foto que
   distinga el corte). splitband/claims/bandmedia ya se distinguen solos, son
   fotos distintas. */
[data-elementor-type="wp-page"] > .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert))
  + .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert)) {
  position: relative;
}
[data-elementor-type="wp-page"] > .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert))
  + .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert))::before {
  content: "";
  position: absolute;
  top: 0; left: 50%;
  width: 120px; height: 1px;
  transform: translate(-50%, -1px);
  background: linear-gradient(to right, transparent, var(--e-global-color-accent) 30%, var(--e-global-color-accent) 70%, transparent);
  z-index: 3;
  pointer-events: none;
}
[data-elementor-type="wp-page"] > .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert))
  + .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert))::after {
  content: "";
  position: absolute;
  top: -5px; left: 50%;
  width: 9px; height: 9px;
  transform: translateX(-50%) rotate(45deg);
  background: var(--e-global-color-accent);
  border: 1px solid var(--e-global-color-bg);
  z-index: 3;
  pointer-events: none;
}

/* -- 2. Gradiente de transicion entre una banda oscura y la clara siguiente,
   o al reves. Se define "clara" por descarte de los cinco marcadores
   oscuros, con :not() encadenado (todos tienen que fallar para contar como
   clara). Un velo de 40px que se desvanece, apoyado en el mismo navy que ya
   usan los veils de splitband/claims/bandmedia, asi que no se inventa un
   tono nuevo. -- */
[data-elementor-type="wp-page"] > .e-con:is(
    :has(.kadima-mark-cta), :has(.kadima-splitband), :has(.kadima-claims),
    :has(.kadima-bandmedia), :has(.kadima-cert)
  )
  + .e-con:not(:has(.kadima-mark-cta)):not(:has(.kadima-splitband)):not(:has(.kadima-claims)):not(:has(.kadima-bandmedia)):not(:has(.kadima-cert)) {
  position: relative;
}
[data-elementor-type="wp-page"] > .e-con:is(
    :has(.kadima-mark-cta), :has(.kadima-splitband), :has(.kadima-claims),
    :has(.kadima-bandmedia), :has(.kadima-cert)
  )
  + .e-con:not(:has(.kadima-mark-cta)):not(:has(.kadima-splitband)):not(:has(.kadima-claims)):not(:has(.kadima-bandmedia)):not(:has(.kadima-cert))::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0; height: 40px;
  background: linear-gradient(to bottom, rgba(26, 43, 74, .10), transparent);
  z-index: 2;
  pointer-events: none;
  /* border: 0 es imprescindible, ver la nota de 4R.1 mas abajo: Elementor usa
     este mismo ::before para dibujar el borde del contenedor, y al fijarle
     una altura de 40px el borde inferior se dibujaba a 40px del tope, o sea
     una linea clara flotando dentro de la seccion. */
  border: 0;
}
/* 2026-08-27, correccion: esta mitad de la regla (clara seguida de oscura)
   agregaba SU PROPIO ::before sobre secciones que YA tienen un ::before
   propio con un velo cuidadosamente medido (kadima-splitband, kadima-claims
   en la linea 2184; kadima-bandmedia en la linea 1429). Un elemento solo
   tiene un ::before: la declaracion de background que gana es la que tenga
   mas especificidad, y esta cadena (cinco :not() encadenados) le ganaba
   por lejos a la del velo original, reemplazando un gradiente medido para
   pasar 4.5:1 (0.94 a 0.90 de opacidad donde cae el texto) por este de
   apenas 0.18, casi transparente. Sintoma reportado: "el texto blanco
   sobre la foto no se lee". Se saca a los tres marcadores con velo propio
   de la lista de "oscura" que dispara este ::before: mark-cta y cert siguen
   adentro porque son fondo solido sin ::before propio, ahi este filete no
   compite con nada. */
[data-elementor-type="wp-page"] > .e-con:not(:has(.kadima-mark-cta)):not(:has(.kadima-splitband)):not(:has(.kadima-claims)):not(:has(.kadima-bandmedia)):not(:has(.kadima-cert))
  + .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert)) {
  position: relative;
}
[data-elementor-type="wp-page"] > .e-con:not(:has(.kadima-mark-cta)):not(:has(.kadima-splitband)):not(:has(.kadima-claims)):not(:has(.kadima-bandmedia)):not(:has(.kadima-cert))
  + .e-con:is(:has(.kadima-mark-cta), :has(.kadima-cert))::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0; height: 40px;
  background: linear-gradient(to bottom, rgba(26, 43, 74, .18), transparent);
  z-index: 2;
  pointer-events: none;
  border: 0;
}

/* ---------- 4R.1 (Ajuste 3) Las dos lineas claras del hero ----------
   Reporte: en /bathroom-remodeling/ se ven dos lineas blancas horizontales
   en la transicion entre el hero y la banda de certificados.

   Diagnosticado midiendo en vivo: la banda de certificados (contenedor
   8f0e4f5 en esa pagina) tiene configurado en el constructor un borde de
   1px #E5E0D8 arriba y abajo, que es deliberado y separa la banda del resto.
   Ese es UN par de lineas, una arriba de la banda y otra abajo, simetricas.

   La linea de mas venia de mi propio pase 4O. Elementor dibuja el borde de
   un contenedor con .e-con::before, tomando los anchos de las custom
   properties --border-block-start-width y compania. Los separadores de 4O
   se colgaron de ese MISMO ::before para pintar el degrade de transicion, y
   al fijarle height: 40px le cambiaron la caja: el borde inferior del
   contenedor dejo de dibujarse abajo y empezo a dibujarse 40px por debajo
   del tope, o sea una linea clara de 1px flotando adentro de la banda
   navy, a 40px de su borde superior. Medido en la pagina: lineas en y=776
   (borde real de la banda), y=816 (la fantasma) y y=933 (borde real de
   abajo). Las dos primeras, separadas por 40px, son las que se reportaron.

   Arreglo: border: 0 en los dos ::before de separador. El degrade sigue
   igual, y el borde del contenedor vuelve a dibujarse donde Elementor lo
   pone. No se toca el borde configurado en el constructor: es intencional y
   quitarlo seria otra decision, no este arreglo.

   Afecta a toda seccion con borde propio que caiga despues de una seccion
   de tono distinto, o sea la banda de certificados en las 20 paginas que la
   tienen debajo del hero, no solo bathroom-remodeling. */

/* -- 3. El filete bronce bajo el H2 crece desde el centro al entrar en
   pantalla, en vez de aparecer fijo. Reusa el pseudo-elemento que ya existe
   (linea 812); no se toca su ancho final, transform-origin, ni color, solo
   se le agrega una animacion de scale-x. */
.elementor-widget-heading h2.elementor-heading-title::after {
  transform-origin: center;
}
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .elementor-widget-heading h2.elementor-heading-title::after {
      animation: kadimaFilete linear both;
      animation-timeline: view();
      animation-range: entry 10% entry 50%;
    }
  }
}
@keyframes kadimaFilete {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

/* -- 4. Chevron sutil al pie del hero, invita a seguir bajando. Solo en la
   primera seccion de cada pagina (el hero). Sin animacion en bucle a
   proposito: 4G.4 (linea 1809) ya establece la regla del sitio, "nada se
   mueve solo, sin que el usuario haga nada" (la unica excepcion es la
   propia entrada por scroll, que para el hero no aplica porque el hero es
   lo primero que se ve, nunca "entra" en pantalla). Un bucle infinito
   rompe esa regla, asi que el chevron queda fijo, no animado. */
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media) {
  position: relative;
}
[data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media)::after {
  content: "";
  position: absolute;
  bottom: 28px; left: 50%;
  width: 14px; height: 14px;
  transform: translateX(-50%) rotate(45deg);
  border-right: 2px solid var(--e-global-color-bg);
  border-bottom: 2px solid var(--e-global-color-bg);
  opacity: .8;
  z-index: 3;
  pointer-events: none;
}
@media (max-width: 767px) {
  [data-elementor-type="wp-page"] > .e-con:first-of-type:has(.kadima-hero-media)::after {
    bottom: 18px;
  }
}

/* ---------- 4O.8 (Reglas 7 y 8) "What We Build" en Home: iconos reales y
   foto por tarjeta ----------
   Regla 7 diagnostico: los 8 iconos de esta seccion (y los de otras 12
   paginas de servicio, ver nota del commit) no eran un fallo de render:
   el compositor original (build/4F-compose-prototype.py) les habia puesto
   a todos el MISMO path generico de relleno, "M4 4h16v16H4Z" (un cuadrado
   inscripto en el viewBox), en vez del icono real de icons.json que le
   toca a cada servicio. El SVG parseaba y pintaba bien, pintaba un
   cuadrado a proposito. Corregido para esta seccion con el mismo lookup
   por destino de enlace que ya usa build/4J-compose.py (bathroom->bano,
   kitchen->cocina, etc.), asi que el icono de cada tarjeta coincide con
   el servicio que describe.

   Regla 8: se agrega una foto real por tarjeta (misma familia hero-* que
   el hero de cada servicio, misma logica de "primera foto libre" que ya
   usa el mosaico de About, para no repetir una foto que la propia home ya
   muestra en otra seccion). El texto de cada tarjeta (h3, parrafo, link)
   no cambio ni un caracter: verificado con validar() de build/body-
   apply.py, que compara texto visible y lista de enlaces character a
   character contra el markup viejo. Solo se agrego un <img> (alt vacio,
   no aporta texto) y se corrigio el <svg> existente.

   Nueva clase .kadima-svc__shot, no .kadima-svcard__shot: esta tarjeta NO
   es un kadima-svcard (esa es la ficha compacta tipo "nombre + CTA" que
   usa About en "What We Do"). Esta conserva el titulo y la descripcion
   completa que ya tenia, la foto se suma arriba. Scopeado con :has() para
   no tocar las kadima-svc SIN foto de otras paginas. */
.kadima-svc:has(.kadima-svc__shot) {
  padding: 0;
  border-radius: var(--k-card-radius);
  box-shadow: var(--k-card-shadow);
  overflow: hidden;
}
.kadima-svc__shot {
  display: block;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background: var(--e-global-color-border);
}
.kadima-svc__shot > img {
  display: block;
  width: 100%;
  height: 100%;
  max-width: 100%;
  object-fit: cover;
}
.kadima-svc:has(.kadima-svc__shot) > .kadima-svc__icon {
  margin: 24px 28px 0;
}
.kadima-svc:has(.kadima-svc__shot) > h3 {
  margin-left: 28px;
  margin-right: 28px;
}
.kadima-svc:has(.kadima-svc__shot) > p {
  margin-left: 28px;
  margin-right: 28px;
}
.kadima-svc:has(.kadima-svc__shot) > p:last-child {
  margin-bottom: 28px;
}
@media (prefers-reduced-motion: no-preference) {
  .kadima-svc__shot > img {
    transition: transform .5s cubic-bezier(.2, .6, .2, 1);
  }
  .kadima-svc:hover .kadima-svc__shot > img {
    transform: scale(1.05);
  }
}

/* ============================================================
   4P. Tres cambios del pedido del 2026-08-27
   ============================================================ */

/* ---------- 4P.1 (Cambio 1) "Where We Work": mapa de Google ----------
   Grid de 2 columnas dentro del mismo widget HTML que ya tenia el parrafo:
   texto a la izquierda, mapa a la derecha. En movil se apila en el orden
   del DOM (texto, despues mapa), sin necesitar order. El iframe usa el
   truco output=embed, que no pide API key; la direccion es la del pie del
   sitio, zoom 10 para que entren Queens, el Bronx, White Plains y
   Westchester (Scarsdale/White Plains visibles en el marco). */
.kadima-prose.kadima-area-split {
  max-width: none;
  width: 100%;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 40px;
  align-items: center;
}
/* Sin min-height a proposito. Con aspect-ratio, un min-height se convierte
   en un ancho minimo (alto / ratio), y ese ancho no respeta la columna de la
   grilla: medido a 768px, min-height 280 forzaba el mapa a 373px dentro de
   una columna de 356 y desbordaba la pagina 9px. El aspect-ratio solo ya da
   una altura proporcional en cualquier ancho. */
.kadima-area-split__map {
  aspect-ratio: 4 / 3;
  border-radius: var(--k-card-radius);
  box-shadow: var(--k-card-shadow);
  overflow: hidden;
}
/* ---------- Recorte de la cabecera del embed de My Maps ----------
   El embed de Google My Maps dibuja arriba una barra propia con el titulo del
   mapa, el NOMBRE DE LA CUENTA que lo creo, y los botones de compartir y
   pantalla completa. No hay parametro para ocultarla (ehbc solo le cambia el
   color de fondo). Se pidio taparla para que el nombre de la cuenta no quede
   publico en el sitio; el titulo no se pierde en la practica porque la
   seccion ya se llama "Where We Work".

   Como: el iframe se estira 67px mas de lo que mide la caja y se sube 67px,
   asi la barra queda por encima del borde y el overflow: hidden de la caja la
   recorta. El borde de abajo del iframe sigue coincidiendo con el de la caja,
   asi que no aparece ningun hueco.

   Los 67px NO son a ojo: se midieron sobre la pagina en vivo tomando una
   captura de la caja del mapa y recorriendo una columna de pixeles hasta
   donde termina la banda oscura. El color medido arriba es rgb(46,49,47), que
   es exactamente el 2E312F que la URL del embed pide por ehbc, o sea que lo
   que se midio es la barra y no un pedazo de mapa. Da 67px igual a 1440 y a
   390: es altura constante, no proporcional al tamano del iframe.

   Se recorta SOLO arriba. Abajo va la atribucion de Google (el logo "Google
   My Maps", "Map data (c)2026 Google" y "Terms"), que las condiciones de uso
   de Google exigen mantener visible. Taparla seria un problema de licencia,
   no una cuestion de diseno.

   Fragilidad conocida: si Google cambia el alto de esa barra, 67px deja de
   ser exacto y se veria una franja oscura arriba (si crece) o se comeria unos
   pixeles de mapa (si se achica). Se revisa volviendo a medir con el mismo
   metodo. */
.kadima-area-split__map iframe {
  display: block;
  width: 100%;
  height: calc(100% + 67px);
  margin-top: -67px;
  border: 0;
}
/* Se apila a 900 y no a 767, el mismo corte que ya usan splitband y claims
   (linea 2286): a 768-900 la columna de texto queda tan angosta que el
   parrafo se parte en cinco lineas al lado de un mapa ilegible de 356px. */
@media (max-width: 900px) {
  .kadima-prose.kadima-area-split {
    grid-template-columns: minmax(0, 1fr);
    gap: 24px;
  }
  .kadima-area-split__map {
    aspect-ratio: 16 / 10;
  }
}
/* Abajo de 560 la caja pasa de 16/10 a 4/3. El motivo original era compensar
   la barra de cabecera del embed, que se comia 67 de 214px; ahora esa barra
   se recorta (ver el bloque de arriba), asi que el motivo que queda es mas
   simple: a 390 de ancho, 16/10 deja el mapa en 214px de alto y los pines de
   Westchester quedan encimados. Con 4/3 son 257 y se separan. No se usa
   min-height a proposito: con aspect-ratio se convierte en un ancho minimo y
   desborda la pagina, que es el defecto que ya se arreglo en 4P. */
@media (max-width: 560px) {
  .kadima-area-split__map {
    aspect-ratio: 4 / 3;
  }
}

/* ---------- 4P.2 (Cambio 2) kadima-splitband: velo mas ancho ----------
   El velo de la banda con foto (4I.1, linea 2184) se midio para una columna
   de texto de 660px: la meseta fuerte (0.90+) se sostenia hasta el 50% del
   ancho de la seccion. La Tarea 1 (4O.4, sesion anterior) subio esa columna
   a 800px sin retocar el velo, asi que a los anchos de escritorio mas
   angostos (1280-1440px) la mitad derecha de varias lineas de texto caia ya
   en la zona de fade, por debajo de 0.70 de opacidad. Medido: sobre el peor
   caso posible (foto blanca pura), 0.70 de navy da exactamente 4.5:1 con
   cream (el piso de AA), y por debajo de eso cae. La meseta fuerte se
   extiende de 50% a 65% (cubre una columna de 800px hasta ~1440px de
   ancho de seccion con margen), y el piso de 0.70 no se cruza hasta el 78%,
   dejando un margen mas alla del borde de la columna antes de que empiece
   a revelarse la foto. Solo splitband: claims usa layout distinto desde
   4P.3, con su propio tratamiento de fondo, y ya no depende de este velo.

   Envuelto en min-width: 901px a proposito. El velo mobile (linea 2293) es
   OTRO ::before del mismo elemento, con la misma especificidad (0,3,1) que
   este, y esta regla queda mas tarde en el archivo: sin el min-width le
   ganaria tambien en mobile y reemplazaria el gradiente vertical ya afinado
   (0.92/0.90/0.86, linea 2295) por este horizontal de 100deg, que en una
   columna angosta de mobile deja palabras en la parte clara del degrade. */
@media (min-width: 901px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband)::before {
    background: linear-gradient(100deg,
      rgba(26, 43, 74, .94) 0%,
      rgba(26, 43, 74, .90) 65%,
      rgba(26, 43, 74, .70) 78%,
      rgba(26, 43, 74, .30) 90%,
      rgba(26, 43, 74, .12) 100%);
  }
}

/* ---------- 4P.3 (Cambio 3) kadima-claims: layout dividido ----------
   Restaura el diseno de 4H.3 (mas abajo en este archivo, buscar "sobre navy
   y a sangre"), que 4I habia reemplazado por el mismo tratamiento de velo
   de splitband. El reporte de esta vuelta ("los iconos con texto sobre la
   foto se pierden") es la razon por la que 4H.3 existia: mitad navy solida
   con los puntos, mitad foto, en vez de texto encima de una foto veiada. Se
   suma lo que 4H.3 no tenia: un degradado horizontal en la propia foto que
   la funde contra el navy solido de la izquierda, en vez de un corte duro
   entre las dos mitades. Contraste: cream sobre navy solido da 13.3:1,
   documentado en el comentario original de 4H.3 y sin cambios aca.

   Todo con [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) sin
   combinar con splitband, para no tocar la banda con foto de al lado
   (4P.2). Donde 4I comparte una cadena con splitband en una lista, se repite
   la cadena entera solo para claims, mas especifica y mas tardia en el
   archivo, asi gana de forma deterministica sin depender de !important. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims)::before {
  content: none;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  align-items: stretch;
  gap: 0;
  max-width: none;
  width: 100%;
  margin: 0;
  padding: 0;
  min-height: 480px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate {
  position: relative;
  inset: auto;
  z-index: 1;
  width: auto;
  height: auto;
  min-height: 320px;
  margin: 0;
  overflow: hidden;
  background: transparent;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(to left, transparent 45%, var(--e-global-color-ink) 100%);
  pointer-events: none;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__list {
  position: relative;
  z-index: 2;
  align-content: center;
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
  max-width: none;
  padding: 56px clamp(24px, calc((100vw - 1200px) / 2 + 24px), 240px) 56px 56px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claim > .kadima-ico {
  color: var(--e-global-color-accent);
  width: 26px;
  height: 26px;
}
@media (max-width: 900px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) {
    min-height: 0;
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims {
    grid-template-columns: minmax(0, 1fr);
    min-height: 0;
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate {
    min-height: 0;
    aspect-ratio: 16 / 10;
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate::after {
    background: linear-gradient(to bottom, transparent 45%, var(--e-global-color-ink) 100%);
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__list {
    padding: 36px 24px 40px;
  }
}

/* ============================================================
   4Q. Tres ajustes del pedido del 2026-08-27 (segunda vuelta)
   ============================================================ */

/* ---------- 4Q.1 (Ajuste 1) "Where We Work": zonas como chips ----------
   El parrafo corrido pasa a una lista de 12 chips. La lista es exactamente
   la misma que el areaServed del JSON-LD (build/schema-injection.php,
   bloque GeneralContractor): Queens, Westchester County, Bronx, Bronxville,
   New Rochelle, Scarsdale, White Plains, Rye, Harrison, Purchase,
   Larchmont, Pelham. Que coincidan no es casual y conviene que siga asi:
   si se agrega una zona, va en los dos lugares.

   Los chips NO son enlaces a proposito. Siete de las doce zonas tienen
   pagina propia y cinco no (Rye, Harrison, Purchase, Larchmont, Pelham),
   asi que enlazar solo algunos deja una fila visualmente despareja y le
   agrega siete enlaces a la malla interna de la home sin que nadie lo
   pidiera. El enlace unico a "See all service areas" se conserva tal cual,
   y de ahi se llega a las que tienen pagina.

   Sobre el fondo de esta seccion (surface, la alternancia que dispara
   kadima-mark-area) el chip va en blanco con borde, mismo lenguaje que los
   chips del pie (4M) pero con su propio tamano: aca son 12 y no 4. */
ul.kadima-areas {
  list-style: none;
  margin: 0 0 28px;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
ul.kadima-areas > li {
  margin: 0;
  display: inline-flex;
  align-items: center;
  padding: 9px 16px;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px;
  line-height: 1.3;
  color: var(--e-global-color-ink);
  background: var(--k-box);
  border: 1px solid var(--e-global-color-border);
  border-radius: 999px;
}
/* 2026-08-27: los 12 chips van IGUALES. Antes el primero (Queens) llevaba
   filo bronce por ser la base de la empresa, pero en una fila de doce se
   leia como "seleccionado", o sea como un filtro activo y no como un dato.
   La base ya esta dicha en el mapa de al lado, que tiene su pin ahi. */
@media (max-width: 767px) {
  ul.kadima-areas { gap: 8px; margin-bottom: 22px; }
  ul.kadima-areas > li { padding: 8px 14px; font-size: 14px; }
}

/* ---------- 4Q.3 (Ajuste 3) "Why We Started Kadima": justificado y enfasis ----------
   El markup suma 5 <strong> y 1 <em> sobre frases que ya estaban escritas.
   Cero cambio de texto visible: las etiquetas no aportan texto, verificado
   con validar() de body-apply.py sin declarar ningun delta.

   Sobre el color no hay nada que hacer: medido en vivo, los cuatro parrafos
   de la banda ya resuelven a cream (250,248,244) sobre navy, o sea 13.3:1, y
   un <strong> hereda ese cream en peso 700. Se declara igual el color de
   forma explicita como seguro: la linea 2015 le pone
   color: var(--e-global-color-muted) a los parrafos hermanos, que hoy pierde
   contra la regla de 4I.1, pero si en el futuro esa specificity cambia, un
   strong heredando el gris #5A6478 sobre navy queda casi invisible. Mejor
   fijarlo ahora que descubrirlo despues.

   EL JUSTIFICADO VA SOLO EN ESTA SECCION, no en todas las bandas. Se pidio
   "en esa seccion" y kadima-splitband se usa en unas 15 secciones repartidas
   por el sitio (process, projects, full-home-renovation, tile-installation,
   drywall-and-painting, carpentry, y varias de zona). Justificar las 15 es un
   cambio mucho mas grande que el pedido, y el justificado no cae igual de
   bien en todas: cuanto mas angosta la columna, mas rios blancos deja. Se
   scopea por el id del widget, el mismo recurso que usa 4N con el boton del
   header. Si despues se quiere en todas, es cambiar esta cadena por
   .kadima-splitband .kadima-sb__body y listo.

   hyphens: auto acompana al justificado a proposito, no es un extra suelto:
   sin cortes de palabra, justificar una columna de 800px con palabras largas
   ("straightforward", "accountable", "conversation") abre huecos entre
   palabras que se leen como rios verticales. Con guiones el reparto queda
   parejo. Si el corte de palabras no gusta, se saca esta linea y el
   justificado sigue funcionando, solo mas irregular. */
.elementor-element-685c79f .kadima-sb__body > p {
  text-align: justify;
  hyphens: auto;
  -webkit-hyphens: auto;
}
/* El renglon del enlace no se justifica: es una linea corta y sola, y
   justificarla le estira el espacio entre "More about" y el resto. */
.elementor-element-685c79f .kadima-sb__body > p.kadima-more {
  text-align: left;
  hyphens: manual;
  -webkit-hyphens: manual;
}
.elementor-element-685c79f .kadima-sb__body strong {
  color: var(--e-global-color-bg);
  font-weight: 700;
}
.elementor-element-685c79f .kadima-sb__body em {
  color: var(--e-global-color-bg);
  font-style: italic;
}

/* ---------- 4S.1 Footer: "Popular Service & Area Combinations" parejo ----------
   Eran cuatro chips en flex-wrap, o sea del ancho de su texto: medidos a 1440
   daban 334, 250 y 264 en la primera fila y el cuarto (320) caia solo a una
   segunda. Se leia desbalanceado y con un hueco grande a la derecha.

   Pasan a grilla de 4 columnas iguales. El chip ocupa la celda entera
   (width y height al 100%) con el texto centrado, asi que los cuatro miden lo
   mismo y estiran a la misma altura aunque uno envuelva en dos lineas, que es
   lo que pasa con "Bathroom Remodeling in Westchester County" a 281px.

   El radio baja de 999px a 10px: una pastilla de dos lineas se lee como un
   error, una tarjeta de dos lineas no. A 1024 pasan a 2x2 y abajo de 560 a
   una sola columna, donde cada chip vuelve a tener el ancho completo. */
[data-elementor-type="footer"] .kadima-combos ul {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 10px;
  align-items: stretch;
}
[data-elementor-type="footer"] .kadima-combos li a {
  display: flex;
  width: 100%;
  height: 100%;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 10px 14px;
  border-radius: 10px;
  line-height: 1.35;
}
@media (max-width: 1024px) {
  [data-elementor-type="footer"] .kadima-combos ul { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  [data-elementor-type="footer"] .kadima-combos ul { grid-template-columns: minmax(0, 1fr); }
}

/* ---------- 4S.2 Nombres propios en bronce ----------
   Se pidio el nombre de la empresa y los de los dos socios en bronce dentro
   de "Why We Started Kadima". El markup suma spans, cero cambio de texto.

   EL BRONCE PURO NO SE PUEDE USAR ACA. Sobre navy da 3.75:1 y sobre el peor
   caso real de la banda (el velo al 0.90 encima de una foto blanca, que
   compone #31405C) da 2.76:1: falla el 4.5 de AA para texto normal. Es la
   misma razon por la que 4H.3 ya dejaba escrito que el bronce va "solo como
   filo y como numeral, nunca como texto corrido". Medido para varias mezclas
   contra ese peor caso: al 80% da 3.71 y sigue fallando, al 65% da 4.53 y
   pasa raspando, al 60% da 4.88. Se toma el 60%, que deja margen y se sigue
   leyendo bronce. Es el mismo recurso que ya usa --k-cert-dato para este
   problema, con un punto mas de holgura.

   El color se declara SOBRE LA CLASE y no como variable en :root, a
   proposito: --e-global-color-accent solo existe en el scope de
   .elementor-kit-5 (el body), asi que un color-mix que la referencie desde
   :root queda invalido y se hereda vacio a todo el documento. Es exactamente
   lo que le pasa a --k-tint (TRASPASO punto 10). Aca el elemento esta dentro
   del body, la variable resuelve, y el literal de arriba cubre al navegador
   sin color-mix.

   Sobre fondo claro la clase cae en accent-text (#8A6633), que ya esta
   verificado en 4.91:1 sobre cream: si el span se reusa fuera de una banda
   oscura, sigue pasando AA. */
.kadima-nombre {
  color: var(--e-global-color-accent-text);
  font-weight: 600;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-nombre,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-nombre {
  color: #C8AE87;
}
@supports (color: color-mix(in srgb, red 50%, white)) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) .kadima-nombre,
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-nombre {
    color: color-mix(in srgb, var(--e-global-color-accent) 60%, var(--e-global-color-bg));
  }
}

/* ---------- 4S.3 / 4U.3 "Our Story": linea de tiempo alternada ----------
   Historial: 4S.3 convirtio las tres cajas en una linea de tiempo vertical con
   la linea a la izquierda. 4U.3 la rehace como linea de tiempo editorial
   alternada, con la linea al CENTRO y los hitos yendo y viniendo de lado. El
   bloque de 4S.3 se reemplaza entero en vez de superponerle reglas, para que
   no queden dos diseños peleandose.

   La grilla es 1fr / 64px / 1fr: dos columnas de contenido y un canal central
   por donde baja la linea. La colocacion es explicita por nth-child porque el
   orden del DOM es fijo (hito, foto, hito, foto, hito) y el zigzag no se puede
   expresar con auto-flow:
     1 hito  -> izquierda, fila 1      2 foto  -> derecha,   fila 1
     3 hito  -> derecha,   fila 2      4 foto  -> izquierda, fila 2
     5 hito  -> izquierda, fila 3
   Si algun dia se agrega o se saca un hito hay que revisar estas cinco
   reglas; queda anotado porque es la parte fragil del diseño.

   El icono de cada hito es el nodo sobre la linea: se posiciona hacia el canal
   central, a la derecha si el hito esta a la izquierda y al reves. Los 54px de
   corrimiento salen de la cuenta 32 (medio canal) + 22 (medio icono).

   Abajo de 900 se apila todo en una columna y la linea vuelve a la izquierda,
   que es lo unico legible en movil. Ahi la colocacion explicita se anula con
   grid-column/grid-row auto. */
.kadima-lf__grid:has(> .kadima-lf__foto) {
  --k-canal: 64px;
  display: grid;
  grid-template-columns: minmax(0, 1fr) var(--k-canal) minmax(0, 1fr);
  gap: 0 0;
  position: relative;
  padding-left: 0;
  align-items: start;
}
.kadima-lf__grid:has(> .kadima-lf__foto)::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 6px;
  bottom: 6px;
  width: 2px;
  margin-left: -1px;
  background: linear-gradient(to bottom,
    var(--e-global-color-accent) 0%,
    var(--e-global-color-accent) 72%,
    rgba(166, 124, 63, .18) 100%);
}
.kadima-lf__grid:has(> .kadima-lf__foto) > * { grid-column: 1; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(1) { grid-column: 1; grid-row: 1; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(2) { grid-column: 3; grid-row: 1; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(3) { grid-column: 3; grid-row: 2; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(4) { grid-column: 1; grid-row: 2; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(5) { grid-column: 1; grid-row: 3; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(6) { grid-column: 3; grid-row: 3; }
/* Dos reglas de 4F.9 le dan grid-column: 1 / -1 al ultimo hito: una porque
   contiene un <ul> (el que agrego 4S.4) y otra por ser el impar final de la
   grilla vieja de dos tarjetas. La segunda mide (0,4,0) y le gana a los
   (0,3,0) de la colocacion de arriba, asi que el hito 3 se estiraba a las dos
   columnas y su nodo quedaba a 632px de la linea. Se las nombra para
   devolverlo a su columna. */
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:has(> ul),
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:nth-of-type(2n+1):last-of-type {
  grid-column: 1;
}

.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block {
  grid-template-columns: minmax(0, 1fr);
  position: relative;
  background: transparent;
  border: 0;
  padding: 0 0 64px;
  row-gap: 12px;
}
/* :last-of-type y no :last-child: desde 4U.4 el ultimo hijo de la grilla es una
   figura, no un hito. Los hitos son <div> y las fotos <figure>, asi que
   :last-of-type sigue apuntando al tercer hito. */
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:last-of-type { padding-bottom: 0; }
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > h3,
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > p,
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > ul {
  grid-column: auto;
}
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > h3 {
  font-size: clamp(21px, 1.7vw, 25px);
}
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > p {
  max-width: none;
  text-align: justify;
  hyphens: auto;
  -webkit-hyphens: auto;
}
/* El nodo sobre la linea. */
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > .kadima-ico {
  position: absolute;
  top: -2px;
  box-sizing: border-box;
  width: 44px; height: 44px;
  padding: 9px;
  margin: 0;
  background: var(--k-box);
  border: 2px solid var(--e-global-color-accent);
  border-radius: 50%;
  color: var(--e-global-color-accent-text);
}
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(1) > .kadima-ico,
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(5) > .kadima-ico { right: -54px; }
.kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(3) > .kadima-ico { left: -54px; }
/* El ultimo hito es el "ahora": nodo lleno en vez de aro. */
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:last-of-type > .kadima-ico {
  background: var(--e-global-color-accent);
  color: var(--e-global-color-bg);
}
/* La ultima figura cierra la grilla: sin margen abajo no deja un hueco suelto. */
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__foto:last-child { margin-bottom: 0; }
.kadima-lf__foto {
  margin: 0 0 64px;
  max-width: none;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: var(--k-card-radius);
  background: var(--e-global-color-border);
}
.kadima-lf__foto > img {
  display: block; width: 100%; height: 100%; max-width: 100%; object-fit: cover;
}
@media (max-width: 900px) {
  .kadima-lf__grid:has(> .kadima-lf__foto) {
    grid-template-columns: minmax(0, 1fr);
    padding-left: 46px;
  }
  /* :nth-child(n) y no *: el reset tiene que igualar la specificity de las
     reglas de colocacion de arriba, o el grid-column: 3 del escritorio sigue
     ganando y crea una tercera columna implicita en movil. Las dos cadenas de
     4F.9 se repiten por el mismo motivo. */
  .kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(n),
  .kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:has(> ul),
  .kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:nth-of-type(2n+1):last-of-type {
    grid-column: 1;
    grid-row: auto;
  }
  .kadima-lf__grid:has(> .kadima-lf__foto)::before { left: 16px; margin-left: 0; }
  .kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block > .kadima-ico,
  .kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(1) > .kadima-ico,
  .kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(3) > .kadima-ico,
  .kadima-lf__grid:has(> .kadima-lf__foto) > :nth-child(5) > .kadima-ico {
    left: -46px; right: auto; width: 34px; height: 34px; padding: 7px;
  }
  .kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block { padding-bottom: 34px; }
  .kadima-lf__foto { aspect-ratio: 16 / 10; margin-bottom: 34px; }
}

/* ---------- 4S.4 "How we work now": los tres compromisos, visibles ----------
   Es el tercer hito de la linea de tiempo de 4S.3, no la seccion "How We
   Work" (esa es otra, un kadima-callout mas abajo en About).

   El parrafo del medio traia, corridas dentro de una sola frase, las tres
   cosas que la empresa sostiene desde 2019. Se separan en tres filas con
   icono propio: equipo para el crew lead, reloj para el cronograma y escoba
   para la limpieza diaria.

   Se pudo hacer SIN tocar una palabra porque las tres eran oraciones
   completas terminadas en punto, no clausulas separadas por coma. Un listado
   hecho con clausulas dejaria comas colgando al final de cada fila, y ahi
   habria que elegir entre cambiar el texto o aceptar algo mal puntuado. Aca
   no hizo falta.

   Los saltos de linea entre <p>, <ul> y cada <li> son obligatorios, no
   estetica: sin ellos la extraccion de texto pega "built on." con "Every
   project" sin espacio y la invariante de texto se rompe. Mismo motivo que
   ya documenta el compositor de 4J.

   El punto del ultimo hito pasa de aro a circulo lleno: es el "ahora" de la
   linea de tiempo y conviene que se distinga de los dos pasados. */
ul.kadima-ahora {
  list-style: none;
  margin: 4px 0 0;
  padding: 0;
  display: grid;
  gap: 12px;
}
ul.kadima-ahora > li {
  display: grid;
  grid-template-columns: 26px minmax(0, 1fr);
  column-gap: 14px;
  align-items: start;
  margin: 0;
  padding: 12px 16px 12px 14px;
  background: var(--k-box);
  border-left: 3px solid var(--e-global-color-accent);
  font-size: 17px;
  line-height: 1.55;
  color: var(--e-global-color-ink);
  text-align: left;
}
ul.kadima-ahora > li > .kadima-ico {
  width: 22px; height: 22px;
  margin-top: 2px;
  color: var(--e-global-color-accent-text);
}
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__block:last-of-type > .kadima-ico {
  background: var(--e-global-color-accent);
  color: var(--e-global-color-bg);
}
@media (max-width: 767px) {
  ul.kadima-ahora > li {
    grid-template-columns: 20px minmax(0, 1fr);
    column-gap: 10px;
    font-size: 16px;
    padding: 10px 12px 10px 12px;
  }
  ul.kadima-ahora > li > .kadima-ico { width: 18px; height: 18px; }
}

/* ============================================================
   4S.6 (Ajuste 5) Mas movimiento al scroll
   ============================================================
   Se amplia lo que ya existe en 4G.4 en vez de montar un sistema nuevo, y se
   respetan sus tres reglas: nada se mueve solo en bucle, nada empuja el
   layout (solo opacity y transform), y con prefers-reduced-motion no queda
   NADA. Cero JavaScript, todo animation-timeline: view().

   TODO vive dentro de @supports (animation-timeline: view()) a proposito: la
   propiedad animation es lo unico que lleva estas piezas de opacity 0 a 1, asi
   que en un navegador sin scroll-timeline la regla entera se descarta y las
   piezas aparecen quietas y completas. Si el opacity:0 se escribiera afuera,
   quedarian invisibles para siempre.

   QUE NO SE TOCA, Y POR QUE. Varios componentes ya tenian entrada y no se
   redeclaran: kadima-claim y kadima-svc (4G.4 mas el escalonado corregido en
   4O.6), kadima-card, kadima-tile, kadima-step, kadima-callout, kadima-vs__side
   (4G.4), kadima-svcard (4J), kadima-easystep (4K), kadima-badge y las fichas
   de FAQ (4O.6), y kadima-cert (4H.6, que ademas apaga la animacion de sus
   hijos a mano). Volver a declararlas desde aca con una cadena mas especifica
   pisaria justamente los animation-range escalonados que ya estan afinados.
   Solo se agregan los componentes que no tenian nada. */

@keyframes kadimaEntraTitulo {
  from { opacity: 0; transform: translateY(14px) scale(.95); }
  to   { opacity: 1; transform: none; }
}
@keyframes kadimaEntraFoto {
  from { transform: scale(1.06); }
  to   { transform: none; }
}
@keyframes kadimaEntraLenta {
  from { opacity: 0; transform: translateY(26px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {

    /* -- Titulos de seccion: escalan de 0.95 a 1 al entrar --
       Solo los H2 del cuerpo, nunca el H1 del hero: el hero es lo primero que
       se ve y nunca "entra" en pantalla, animarlo lo dejaria a medio camino.
       El filete bronce de abajo ya tiene su propia animacion en 4O (kadimaFilete)
       y no se toca: van juntos y se leen como una sola entrada. */
    [data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h2.elementor-heading-title {
      animation: kadimaEntraTitulo linear both;
      animation-timeline: view();
      animation-range: entry 5% entry 45%;
    }

    /* -- Los que no tenian entrada -- */
    .kadima-lf__block,
    .kadima-lf__foto,
    ul.kadima-ahora > li,
    .kadima-spec__row {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 40%;
    }

    /* -- Escalonado, por animation-range y no por animation-delay --
       Sobre una linea de tiempo de scroll el delay en segundos se ignora. Es
       el error que 4G.4 dejo en la linea 1845 y que 4O.6 corrigio; aca se
       aplica el criterio correcto desde el principio. */
    .kadima-lf__block:nth-child(2),
    ul.kadima-ahora > li:nth-child(2),
    .kadima-spec__row:nth-child(2) { animation-range: entry 5% entry 45%; }
    .kadima-lf__block:nth-child(3),
    ul.kadima-ahora > li:nth-child(3),
    .kadima-spec__row:nth-child(3) { animation-range: entry 10% entry 50%; }
    .kadima-lf__block:nth-child(4),
    .kadima-spec__row:nth-child(4) { animation-range: entry 15% entry 55%; }

    /* -- Zoom de entrada en la foto --
       VA SOLO EN kadima-lf__foto, y esto es deliberado. 4H.6 dejo escrito el
       motivo: una animacion con fill "both" cuyo fotograma final dice
       transform: none GANA en la cascada sobre cualquier transform declarado,
       asi que mientras la animacion siga puesta ese transform queda muerto. Y
       una animacion de scroll-timeline esta siempre activa, su progreso lo fija
       el scroll. Ponerle este zoom a .kadima-svc__shot > img o a
       .kadima-svcard__shot > img MATARIA el zoom de hover que esas fotos ya
       tienen (4J y 4O). Entre las dos, el hover es el que responde al usuario y
       se queda. kadima-lf__foto no tiene hover, asi que ahi el zoom de entrada
       entra sin pisar nada. */
    .kadima-lf__foto { view-timeline-name: --kadimaFotoTL; }
    .kadima-lf__foto > img {
      animation: kadimaEntraFoto linear both;
      animation-timeline: --kadimaFotoTL;
      animation-range: entry 0% entry 55%;
    }

    /* -- Las bandas oscuras entran mas lento que las claras --
       Recorren de 0 a 70% del rango de entrada en vez de 0 a 40, o sea que el
       fundido dura casi el doble de scroll. Se aplica al CUERPO de la banda y
       no a la seccion: la seccion lleva la foto de fondo y el velo, y animarle
       el opacity despegaria una del otro. */

    /* -- Por que estas dos usan una linea de tiempo NOMBRADA y no view() --
       Medido: con view() se quedaban clavadas, opacidad 1 en todo el scroll,
       mientras el resto si animaba. La causa es que overflow: hidden convierte
       a un elemento en contenedor de scroll, y view() se mide contra el
       contenedor de scroll mas cercano. La banda oscura lo tiene puesto en su
       .e-con desde 4H.1, y la figura de la foto lo tiene desde 4S.3 para
       recortar el zoom. Ese contenedor nunca scrollea, asi que el progreso se
       quedaba en cero para siempre.
       Con view-timeline-name declarado en el elemento que recorta, la linea de
       tiempo se mide contra el scroller de ESE elemento, que es el documento, y
       queda visible para sus descendientes. Verificado despues del cambio con
       un barrido de la pagina: la opacidad minima observada baja de 1 a 0. */
    [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband),
    [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) {
      view-timeline-name: --kadimaBandaTL;
    }
    .kadima-splitband .kadima-sb__body,
    .kadima-claims .kadima-claims__list {
      animation: kadimaEntraLenta linear both;
      animation-timeline: --kadimaBandaTL;
      animation-range: entry 0% entry 70%;
    }
  }
}

/* ---------- 4T.1 "Why We Started Kadima": alineacion pareja y marca de agua ----------
   ALINEACION. Se reporto que el primer parrafo se veia "corrido a la derecha".
   Medido: los cuatro parrafos arrancan exactamente en x=120, no hay ningun
   indent. Lo que cambia es el ANCHO. La regla .kadima-sb__body > p fija
   max-width: 62ch, y ch se resuelve contra el tamano de fuente de CADA
   parrafo. El primero es la bajada, a clamp(19px, 1.45vw, 23px) = 20.88px, asi
   que sus 62ch dan 817px; los otros, a 17px, dan 665px. Con el texto
   justificado de 4Q.3 eso deja el primer parrafo llegando 135px mas a la
   derecha que el resto, y ese borde derecho desparejo es lo que se lee como
   desalineado. Se quita el tope por parrafo y todos pasan a los 800px del
   cuerpo: mismo borde izquierdo y mismo borde derecho. Aplica a las 15
   secciones con splitband, porque el defecto estaba en todas.

   MARCA DE AGUA. El logo del repo (assets/logo, 3008x3008 con fondo
   transparente) se bajo a 800px y se subio a la Media Library, id 1733, que el
   servidor sirve en WebP. No se uso el del header: ese "SVG" es en realidad un
   PNG de 127x120 embebido en base64, y llevarlo a 520px lo dejaria borroso.

   Va DETRAS del texto y no en el margen. Primero se probo en la franja
   izquierda de 120px, pero ahi solo entra un recorte del lockup y se lee como
   un fragmento de letras cortado, no como una marca. Grande y detras es lo que
   hace que se lea como marca de agua.

   Detras del texto exige revisar contraste. Medido sobre el peor caso real de
   la banda (velo navy 0.90 sobre una foto blanca pura, que compone #31405C):
   sin marca, el cream da 9.81:1; con la marca al 0.15 baja a 6.29:1, y aun al
   0.18 queda en 5.76:1. Se toma 0.15, dentro del rango pedido y con margen
   sobre el 4.5 de AA.

   El apilado no salia solo. Un ::after pinta DESPUES de los hijos del
   elemento, asi que con el mismo z-index la marca tapaba el texto. Se sube el
   titulo y el cuerpo a z-index 3 y la marca queda en 2: asi entra por encima
   del velo (que es el ::before, tambien en 2, pero pinta antes) y por debajo
   del texto.

   Scopeada a la seccion de Home por su id. Hay 15 secciones con splitband en
   el sitio y repetir el logo en las 15 lo convertiria en papel tapiz. Debajo
   de 1200px se apaga: ahi la franja libre se angosta y la marca quedaria
   pisando el texto en vez de acompanarlo. */
.kadima-splitband .kadima-sb__body > p {
  max-width: none;
}
[data-elementor-type="wp-page"] > .e-con.elementor-element-08cb80d > .e-con-inner > .elementor-widget-heading,
[data-elementor-type="wp-page"] > .e-con.elementor-element-08cb80d .kadima-sb__body {
  z-index: 3;
}
/* 2026-08-27, 4U.2: la marca pasa de la izquierda a la derecha. A la
   izquierda quedaba detras del texto, que la obligaba a 0.15 para no comerle
   contraste; del lado derecho cae sobre el hueco que queda entre el borde
   derecho del texto (x=920) y la foto, asi que no compite con nada. Se
   conserva la misma opacidad pedida. */
[data-elementor-type="wp-page"] > .e-con.elementor-element-08cb80d::after {
  content: "";
  position: absolute;
  right: -60px;
  top: 50%;
  width: 520px;
  height: 520px;
  transform: translateY(-50%);
  background: url("https://kadimacontruction.com/wp-content/uploads/2026/08/kadima-logo-marca-768x768.png.webp") no-repeat center / contain;
  opacity: .15;
  z-index: 2;
  pointer-events: none;
}
@media (max-width: 1200px) {
  [data-elementor-type="wp-page"] > .e-con.elementor-element-08cb80d::after { content: none; }
}

/* ---------- 4T.2 "Our Story": una foto por hito ----------
   Se pidio una foto distinta entre cada hito en vez de una sola en el medio.
   La primera (hero-wholehome-5) ya estaba despues de "Eight years in the trade
   first"; se suma hero-wholehome-7 despues de "Why 2019". Distintas entre si y
   ninguna repetida en el resto de About, comprobado contra el HTML servido.

   Se les ata el ancho al de la columna de texto con la misma variable
   --k-medida-hito, para que la foto no salga mas ancha que el parrafo que la
   precede. Antes la figura era del ancho de la grilla (1138px) contra 730 del
   texto, que es lo que hacia que la unica foto se leyera como un corte suelto
   y no como parte del hito.

   Radio y entrada al scroll ya venian de 4S.3 y 4S.6 y alcanzan a las dos
   figuras sin tocar nada: la cadena apunta a .kadima-lf__foto y el zoom de la foto
   usa una linea de tiempo nombrada que cada figura declara por su cuenta. */
/* 2026-08-27, 4U.3: en la linea de tiempo alternada la foto ocupa su columna
   entera, asi que el tope de --k-medida-hito ya no corresponde. Se anula aca y
   no se borra la variable, que sigue documentando la medida de lectura. */
.kadima-lf__grid:has(> .kadima-lf__foto) > .kadima-lf__foto {
  max-width: none;
}

/* ---------- 4T.3 "Our Story": textura de fondo con deriva al scroll ----------
   La seccion era blanco plano. Se le suman tres capas de fondo, todas CSS/SVG,
   sin archivos nuevos:
     1. una trama de lineas diagonales a 58px, en navy al 0.035 de opacidad
     2. un halo bronce al 0.05 arriba
     3. un halo navy al 0.04 abajo a la izquierda
   Los dos halos son los que dan la profundidad; la trama sola se leia como
   papel rayado. Primero se probo la trama a 0.055 con tile de 46px y las
   lineas se veian de mas, sobre todo en la mitad derecha vacia: bajo a 0.035 y
   el tile subio a 58px para separarlas.

   El fondo va sobre la SECCION y no sobre un pseudo-elemento, a proposito.
   Con ::before habria repetido el choque de 4R.1, porque Elementor usa ese
   mismo pseudo-elemento para el borde del contenedor; y con ::after habria
   que pelear el apilado contra el contenido, que ya se pago caro en 4T.1. El
   fondo propio queda naturalmente detras de todo, sin z-index de por medio.

   La deriva usa background-position y no transform. Un transform sobre un
   pseudo-elemento seria mas barato de componer, pero necesitaria recortar el
   desborde, y poner overflow: hidden en esta seccion romperia las animaciones
   de entrada de los hitos que viven adentro: overflow: hidden convierte al
   elemento en contenedor de scroll y view() pasa a medir contra el, que nunca
   scrollea. Es exactamente el defecto que se corrigio en 4S.6. Mover el fondo
   no reflowea y no necesita recorte.

   El rango es cover y no entry: la seccion mide 2722px, con entry la trama
   terminaria de moverse antes de que se vea la mitad del contenido. Con cover
   la deriva acompana todo el recorrido, un tile completo de punta a punta.
   Verificado en vivo: la posicion va de 0 a -58px a medida que se scrollea. */
[data-elementor-type="wp-page"] > .e-con.elementor-element-5e7146f {
  background-image:
    url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%2758%27%20height%3D%2758%27%3E%3Cpath%20d%3D%27M0%2058L58%200M-14%2014L14%20-14M44%2072L72%2044%27%20stroke%3D%27%231A2B4A%27%20stroke-opacity%3D%270.035%27%20stroke-width%3D%271%27%20fill%3D%27none%27%2F%3E%3C%2Fsvg%3E"),
    radial-gradient(120% 70% at 50% 0%, rgba(166, 124, 63, .05) 0%, rgba(166, 124, 63, 0) 62%),
    radial-gradient(90% 55% at 12% 100%, rgba(26, 43, 74, .04) 0%, rgba(26, 43, 74, 0) 70%);
  background-repeat: repeat, no-repeat, no-repeat;
  background-size: 58px 58px, 100% 100%, 100% 100%;
  background-position: 0 0, 50% 0, 12% 100%;
}
@keyframes kadimaTrama {
  from { background-position: 0 0,     50% 0, 12% 100%; }
  to   { background-position: 0 -58px, 50% 0, 12% 100%; }
}
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    [data-elementor-type="wp-page"] > .e-con.elementor-element-5e7146f {
      animation: kadimaTrama linear both;
      animation-timeline: view();
      animation-range: cover 0% cover 100%;
    }
  }
}

/* ---------- 4U.1 Tarjetas de sub-servicio: justificado y remate abajo ----------
   Acompana al pase de fotos e iconos de las 8 paginas de servicio. Lo demas
   que se pidio ya estaba resuelto y se verifico en vivo antes de tocar nada,
   asi que no se vuelve a declarar:
     - misma altura por fila: .kadima-subservices es grid y sus items ya
       estiran por defecto (align-items: stretch es el valor inicial)
     - el enlace pegado al fondo: .kadima-svc p:last-child ya trae
       margin-top: auto desde la linea 231
     - entrada escalonada: .kadima-svc entra con kadimaEntra desde 4G.4 y el
       escalonado por animation-range esta desde 4O.6, hasta nth-child(9)
   Queda solo el justificado. El renglon del enlace se deja alineado a la
   izquierda: es una linea corta y sola, justificarla le estira los espacios. */
.kadima-svc > p {
  text-align: justify;
  hyphens: auto;
  -webkit-hyphens: auto;
}
.kadima-svc > p.kadima-more {
  text-align: left;
  hyphens: manual;
  -webkit-hyphens: manual;
}

/* ============================================================
   4V. "Check Our Work": galeria de obra real en /projects/
   ============================================================
   Primera seccion del sitio construida con foto propia del cliente y no con
   imagen generada. Las 85 fotos entraron a la Media Library con el prefijo
   kadima-real-, justamente para poder distinguirlas de las decorativas de IA
   de un vistazo, en la biblioteca y en el markup.

   El cliente pidio galeria general y NO agrupada por servicio, asi que aca no
   hay filtros ni pestanas: una sola grilla, ordenada a mano para que dos fotos
   del mismo oficio no queden pegadas.

   Tres decisiones de diseno que conviene no revertir sin leer esto:

   1. Proporcion uniforme 4/3 con object-fit: cover. Las fuentes mezclan
      vertical y horizontal, y una grilla de proporciones mixtas se lee como
      galeria generica de WordPress, que es exactamente lo que el pedido
      excluye. El costo es que a las verticales les recorta arriba y abajo.
      El manifiesto (build/fotos-reales-manifest.json) ya trae anotado el
      recorte recomendado foto por foto; cuando se apliquen, esta regla no
      cambia, solo mejora el encuadre de origen.
   2. El zoom del hover va sobre la imagen y la entrada al scroll sobre la
      figura, NUNCA sobre el mismo elemento. Una animacion de scroll con
      fill: both que termina en transform: none deja fijado ese transform y
      mata cualquier otro transform declarado, o sea que el zoom no volveria
      a andar. Ya paso una vez en este archivo y esta documentado en 4H.6.
   3. La figura NO lleva overflow: hidden. El recorte lo hace un envoltorio
      interno. Un elemento con overflow: hidden es un contenedor de scroll, y
      view() pasa a medir contra algo que no scrollea nunca, asi que la
      animacion de entrada se queda congelada en su primer fotograma. */

.kadima-work {
  --kw-cols: 4;
  --kw-gap: 18px;
  max-width: none;
  width: 100%;
}

/* Encabezado de la seccion. El volanta en versalitas espaciadas es lo que
   separa un portfolio de estudio de una galeria de plugin. */
.kadima-work__eyebrow {
  display: block;
  font-size: .74rem;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--e-global-color-accent);
  margin: 0 0 10px;
}
.kadima-work__lead {
  max-width: 62ch;
  margin: 0 0 44px;
}
/* Filete fino de cierre del encabezado, a todo el ancho de la grilla. */
.kadima-work__rule {
  height: 1px;
  border: 0;
  margin: 0 0 32px;
  background: var(--e-global-color-border);
}

.kadima-work__grid {
  display: grid;
  grid-template-columns: repeat(var(--kw-cols), minmax(0, 1fr));
  gap: var(--kw-gap);
  margin: 0;
  padding: 0;
  list-style: none;
}

.kadima-work__item {
  margin: 0;
  padding: 0;
  min-width: 0;
}

/* El envoltorio es el que recorta y el que redondea. Separado de la figura a
   proposito: ver la nota 3 de arriba. */
.kadima-work__frame {
  display: block;
  position: relative;
  overflow: hidden;
  border-radius: 4px;
  background: var(--e-global-color-surface);
  aspect-ratio: 4 / 3;
  box-shadow: 0 1px 2px rgba(26, 43, 74, .06);
}
.kadima-work__frame > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

/* Pie de foto: se lee como ficha de obra, no como descripcion. */
.kadima-work__cap {
  display: block;
  margin: 10px 2px 0;
  font-size: .8rem;
  line-height: 1.4;
  color: var(--e-global-color-muted);
}

/* Sub-encabezado de las dos sub-secciones. */
.kadima-work__sub {
  display: flex;
  align-items: baseline;
  gap: 14px;
  margin: 64px 0 24px;
}
.kadima-work__sub > h3 {
  margin: 0;
  font-size: 1.18rem;
  letter-spacing: .01em;
}
.kadima-work__sub::after {
  content: "";
  flex: 1 1 auto;
  height: 1px;
  background: var(--e-global-color-border);
}

/* ---------- Pares de antes y despues ----------
   Lado a lado de verdad: las dos mitades comparten una sola caja y las separa
   un canal de 2px, asi la comparacion se lee de un golpe. Cada mitad lleva su
   etiqueta encima, porque sin etiqueta el par se lee como dos fotos sueltas. */
.kadima-work__pairs {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 28px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.kadima-work__pair {
  margin: 0;
  min-width: 0;
}
.kadima-work__pair > .kadima-work__duo {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 2px;
  overflow: hidden;
  border-radius: 4px;
  box-shadow: 0 1px 2px rgba(26, 43, 74, .06);
}
.kadima-work__half {
  position: relative;
  overflow: hidden;
  aspect-ratio: 3 / 4;
  background: var(--e-global-color-surface);
}
.kadima-work__half > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}
.kadima-work__tag {
  position: absolute;
  z-index: 2;
  top: 10px;
  left: 10px;
  padding: 3px 9px;
  border-radius: 2px;
  font-size: .66rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--e-global-color-bg);
  background: rgba(26, 43, 74, .82);
}

/* ---------- Movimiento ----------
   Mismas tres reglas de 4G.4: nada se mueve en bucle, nada empuja el layout,
   y con prefers-reduced-motion no queda nada. */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .kadima-work__item,
    .kadima-work__pair {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 38%;
    }
    /* El escalonado va por animation-range y NO por animation-delay: una linea
       de tiempo de scroll ignora el delay por completo, asi que con delay las
       cuatro columnas entrarian exactamente juntas. Esta documentado mas
       arriba en este archivo, en la nota de 4L. El desfase se aplica por
       posicion de columna, con 4n para que se repita fila a fila. */
    .kadima-work__grid > .kadima-work__item:nth-child(4n + 2) { animation-range: entry 3% entry 41%; }
    .kadima-work__grid > .kadima-work__item:nth-child(4n + 3) { animation-range: entry 6% entry 44%; }
    .kadima-work__grid > .kadima-work__item:nth-child(4n + 4) { animation-range: entry 9% entry 47%; }
    .kadima-work__pairs > .kadima-work__pair:nth-child(2n)    { animation-range: entry 4% entry 42%; }
  }

  /* Zoom del hover. 1.05 es lo pedido y es lo que corresponde: mas se lee como
     efecto y no como acabado. La curva es larga a proposito, 520ms, porque un
     zoom rapido en una foto de obra parece un banner. */
  .kadima-work__frame > img,
  .kadima-work__half > img {
    transition: transform .52s cubic-bezier(.22, .61, .36, 1);
  }
  .kadima-work__frame,
  .kadima-work__pair > .kadima-work__duo {
    transition: box-shadow .3s ease;
  }
  .kadima-work__item:hover .kadima-work__frame > img,
  .kadima-work__item:focus-within .kadima-work__frame > img,
  .kadima-work__pair:hover .kadima-work__half > img,
  .kadima-work__pair:focus-within .kadima-work__half > img {
    transform: scale(1.05);
  }
  .kadima-work__item:hover .kadima-work__frame,
  .kadima-work__pair:hover > .kadima-work__duo {
    box-shadow: 0 14px 30px rgba(26, 43, 74, .14);
  }
}

/* ---------- Cortes ----------
   3 columnas en tablet y 2 en movil, tal como se pidio. Las reglas nombran la
   variable y no la propiedad de grilla, asi que no hay que repetir el
   grid-template-columns en cada corte ni arriesgar que una cadena mas
   especifica de mas arriba le gane a la del corte. */
@media (max-width: 1024px) {
  .kadima-work { --kw-cols: 3; }
}
@media (max-width: 767px) {
  .kadima-work {
    --kw-cols: 2;
    --kw-gap: 12px;
  }
  .kadima-work__lead { margin-bottom: 32px; }
  .kadima-work__sub { margin: 44px 0 18px; }
  .kadima-work__cap { font-size: .74rem; }
  /* Los pares pasan a uno por fila, pero cada par SIGUE lado a lado por
     dentro: apilar el antes sobre el despues rompe la comparacion, que es lo
     unico que justifica la sub-seccion. */
  .kadima-work__pairs {
    grid-template-columns: minmax(0, 1fr);
    gap: 22px;
  }
  .kadima-work__tag {
    top: 6px;
    left: 6px;
    padding: 2px 7px;
    font-size: .6rem;
  }
}

/* ---------- 4V.2 El encabezado de la seccion tiene que estirarse ----------
   Medido en /projects/ el 2026-08-28 con CSS.getMatchedStylesForNode, no
   leyendo el archivo: el h2 de la seccion nueva salia centrado y de 360px,
   mientras el de la seccion de al lado media 1248px y arrancaba a la
   izquierda. La diferencia NO estaba en el widget ni en el contenedor, que
   tienen ajustes identicos: viene de la regla de la linea 2360, que da
   width: 100% y align-self: stretch pero solo a las secciones que contienen
   .kadima-splitband o .kadima-claims. Sin una de esas dos clases el widget
   se dimensiona por su contenido y el contenedor lo centra.

   Se replica la misma cadena para .kadima-work, mas la del h2 de la linea
   2365, que es la que lo alinea a la izquierda dentro del ancho estirado.
   El widget de HTML se suma con la forma de la linea 2648, que es la que ya
   usan cards, subservices y badges para el mismo problema.

   No hace falta pareja dentro de ningun corte: mas abajo no se toca ninguna
   de estas tres propiedades para .kadima-work. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-work:not(.kadima-work--compacta)) > .e-con-inner > .elementor-widget-heading,
.e-con-inner > .elementor-widget:has(> .kadima-work) {
  width: 100%;
  align-self: stretch;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-work:not(.kadima-work--compacta)) h2.elementor-heading-title {
  display: block;
  max-width: 900px;
  margin-left: 0;
  margin-right: auto;
}

/* ---------- 4V.3 El filete bronce del H2 va a la izquierda ----------
   El filete de la linea 1936 esta posicionado en absoluto con left: 50% y
   translateX(-50%), o sea centrado bajo el titulo. Eso es correcto para las
   secciones de titulo centrado, pero en esta el titulo esta a la izquierda y
   el filete quedaba flotando en el medio, sin nada encima.

   La correccion es la misma de la linea 2290, que ya la hacen splitband y
   claims por el mismo motivo: left: 0 y transform: none. El transform: none
   no pelea con la animacion del filete (linea 4070): esa anima scaleX con
   transform-origin: center, y lo que posiciona es left, no el transform. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-work:not(.kadima-work--compacta)) h2.elementor-heading-title::after {
  left: 0;
  transform: none;
}

/* ============================================================
   5I. Banda de cierre de la home: tira de cuatro oficios
   ============================================================
   Reemplaza al pase 4W, que mostraba una sola foto del operario sobre un fondo
   desenfocado. Esa foto era kadima-real-crew-01, y resulto ser la MISMA imagen
   que ahora usa "Why Kadima Contruction" mas arriba en la pagina: comparadas,
   crew-01 mide 340x510 y DSC_0806 mide 2349x3519, con la misma proporcion
   (0.667 contra 0.668) y 62 de 64 bits de firma perceptual iguales. O sea que
   crew-01 es la misma toma reducida a un septimo, y la home la repetia dos
   veces. crew-01 queda sin uso en el sitio.

   Ahora la banda son cuatro fotos de cuatro oficios distintos, elegidas entre
   las marcadas como GALERIA y comprobadas contra el HTML servido de la home
   para que ninguna se repita: carpinteria, bano, cocina y sotano.

   Las celdas son cuadradas y no de proporcion libre. Las cuatro fotos vienen
   con orientaciones distintas, dos verticales y dos apaisadas, y una tira donde
   cada celda respeta su proporcion se lee como un collage desprolijo en vez de
   como una banda. Con el cuadrado y object-fit: cover las cuatro miden lo mismo
   y la tira queda al ras.

   El velo va suave, 0.38, porque aca no hay texto encima: su unico trabajo es
   bajar la saturacion para que la tira se integre con el navy del CTA que viene
   justo despues, no proteger legibilidad. */

.kadima-tira {
  position: relative;
  isolation: isolate;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 2px;
  width: 100%;
  margin: 0;
  padding: 0;
  list-style: none;
  background: var(--e-global-color-ink);
}
.kadima-tira__cel {
  position: relative;
  margin: 0;
  overflow: hidden;
  aspect-ratio: 1 / 1;
  background: var(--e-global-color-ink);
}
.kadima-tira__cel > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.kadima-tira::after {
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0;
  pointer-events: none;
  background: rgba(26, 43, 74, .38);
}

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    /* La entrada va sobre la celda, que no recorta: el recorte lo hace su
       propio overflow, y una animacion de view() sobre un elemento que ES
       contenedor de scroll se queda en el primer fotograma. El escalonado va
       por animation-range, que es lo unico que una linea de tiempo de scroll
       respeta. */
    .kadima-tira__cel {
      animation: kadimaFadeTexto linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 36%;
    }
    .kadima-tira__cel:nth-child(2) { animation-range: entry 4% entry 40%; }
    .kadima-tira__cel:nth-child(3) { animation-range: entry 8% entry 44%; }
    .kadima-tira__cel:nth-child(4) { animation-range: entry 12% entry 48%; }
  }
  .kadima-tira__cel > img { transition: transform .5s cubic-bezier(.2, .6, .2, 1); }
  .kadima-tira__cel:hover > img { transform: scale(1.05); }
}

@media (max-width: 767px) {
  /* Cuatro en fila a 390px de ventana dan celdas de 97px, que no muestran nada.
     Pasan a dos por dos: sigue siendo una banda a ancho completo y cada foto se
     ve. Es la unica desviacion de "cuatro en una fila", y es por tamano. */
  .kadima-tira { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* ============================================================
   4X. Entrada escalonada de los chips de zona
   ============================================================
   Los 12 chips de "Where We Work" (4Q.1) entran uno detras de otro en vez de
   aparecer la fila entera de golpe.

   El escalonado va por animation-range y NO por animation-delay. Una linea de
   tiempo de scroll ignora el delay por completo: el delay se mide en tiempo y
   aca no corre el tiempo, corre el scroll. Con delay los 12 entrarian
   exactamente juntos. Ya esta documentado mas arriba, en 4L y en 4V, y el
   bloque de 4G.4 todavia arrastra ese error para otras piezas.

   El paso es 2.5% de la ventana de entrada por chip. Con 12 chips el ultimo
   arranca en 27.5%, o sea que la fila entera termina de componerse antes de
   que la seccion llegue a la mitad de la pantalla. Mas paso se percibe como
   lentitud y no como ritmo, que es el mismo tope que se uso en 4G.4.

   Como los chips van en flex-wrap, el orden por nth-child recorre la fila de
   izquierda a derecha y sigue en la siguiente, que es justo el barrido pedido.

   El desplazamiento es de 10px y no de los 18px de kadimaEntra: un chip mide
   39px de alto, y 18px sobre 39 se lee como salto. */

@keyframes kadimaChip {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    ul.kadima-areas > li {
      animation: kadimaChip linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 36%;
    }
    ul.kadima-areas > li:nth-child(2) { animation-range: entry 2.5% entry 38.5%; }
    ul.kadima-areas > li:nth-child(3) { animation-range: entry 5% entry 41%; }
    ul.kadima-areas > li:nth-child(4) { animation-range: entry 7.5% entry 43.5%; }
    ul.kadima-areas > li:nth-child(5) { animation-range: entry 10% entry 46%; }
    ul.kadima-areas > li:nth-child(6) { animation-range: entry 12.5% entry 48.5%; }
    ul.kadima-areas > li:nth-child(7) { animation-range: entry 15% entry 51%; }
    ul.kadima-areas > li:nth-child(8) { animation-range: entry 17.5% entry 53.5%; }
    ul.kadima-areas > li:nth-child(9) { animation-range: entry 20% entry 56%; }
    ul.kadima-areas > li:nth-child(10) { animation-range: entry 22.5% entry 58.5%; }
    ul.kadima-areas > li:nth-child(11) { animation-range: entry 25% entry 61%; }
    ul.kadima-areas > li:nth-child(12) { animation-range: entry 27.5% entry 63.5%; }
  }
}

/* ============================================================
   4Y. Texturas de material en algunas secciones claras
   ============================================================
   Ladrillo a soga, veta de piedra y grano de estuco, en el navy de la marca y
   a opacidades de 0.032, 0.040 y 0.038. Se notan al bajar y no compiten con el
   texto: a esa opacidad el trazo sobre cream da una diferencia de luminancia
   por debajo de 1.5 sobre 255, o sea que ningun texto pierde contraste.

   Van como background-image sobre el contenedor y NO como un ::before. Ese
   pseudo-elemento no esta libre: Elementor lo usa para dibujar los bordes del
   contenedor, y splitband, claims y bandmedia lo usan para su velo. Tomarlo
   prestado ya causo tres regresiones en este archivo, documentadas en 4P y 4R.

   El !important no es pereza y no se puede evitar. Elementor trae una regla de
   lazy-load propia,
     .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload)
       { background-image: none !important }
   que apaga el fondo de toda seccion de la tercera en adelante hasta que su JS
   le agrega la clase e-lazyloaded. Ese JS solo la agrega cuando la imagen viene
   declarada en los ajustes del elemento en Elementor, no cuando viene del kit,
   asi que sin !important las texturas solo aparecian en la seccion 2 de cada
   pagina: medido, 3 de 64 secciones en 8 paginas. Aca ademas no hay nada que
   diferir, la textura es un data URI que ya viaja dentro del propio CSS.
   La cadena de este bloque es (0,11,1) contra la (0,5,0) de Elementor, o sea
   que entre dos !important gana esta por especificidad.

   Por que funciona apilar background-image sobre las reglas de tono: esas usan
   la forma corta "background:", que resetea background-image a none. Este
   bloque va al final del archivo, o sea despues, y declara solo la propiedad
   larga background-image, asi que el color de la seccion queda intacto y la
   textura se dibuja encima. Si alguna vez se agrega una regla de tono DESPUES
   de esta, con la forma corta, borra las texturas sin avisar.

   Cuales quedan afuera: la primera seccion, que es el hero con su slider, y
   toda seccion oscura, que se reconoce por su marcador de componente. La lista
   de marcadores oscuros salio de rastrear que reglas ponen ink de fondo:
   mark-cta, bandmedia, claims, splitband, cert y crew. La trustbar tambien,
   que es una barra fina de 18px y no tiene donde mostrar una textura.

   Cuales quedan adentro y con cual: se toma una de cada dos secciones y se
   rota entre las tres texturas, o sea 6n+2 ladrillo, 6n+4 piedra y 6n+6
   estuco. El conteo corre sobre TODAS las secciones y no solo las claras, asi
   que el patron que resulta es irregular de pagina en pagina. Es deliberado:
   una alternancia perfecta se lee como plantilla. */

[data-elementor-type="wp-page"] > .e-con:not(:first-of-type):not(:has(.kadima-mark-cta)):not(:has(.kadima-bandmedia)):not(:has(.kadima-claims)):not(:has(.kadima-splitband)):not(:has(.kadima-cert)):not(:has(.kadima-tira)):not(:has(.kadima-hero-media)):not(:has(.kadima-trustbar)):nth-of-type(6n + 2) {
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120%22%20height%3D%2260%22%20viewBox%3D%220%200%20120%2060%22%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%231a2b4a%22%20stroke-width%3D%221.4%22%20opacity%3D%220.032%22%3E%3Cpath%20d%3D%22M0%20.7h120M0%2030.7h120M0%2060.7h120%22%2F%3E%3Cpath%20d%3D%22M30%200v30M90%200v30M0%2030v30M60%2030v30M120%2030v30%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") !important;
  background-repeat: repeat;
  background-size: 120px 60px;
  background-position: center top;
}
[data-elementor-type="wp-page"] > .e-con:not(:first-of-type):not(:has(.kadima-mark-cta)):not(:has(.kadima-bandmedia)):not(:has(.kadima-claims)):not(:has(.kadima-splitband)):not(:has(.kadima-cert)):not(:has(.kadima-tira)):not(:has(.kadima-hero-media)):not(:has(.kadima-trustbar)):nth-of-type(6n + 4) {
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22240%22%20height%3D%22240%22%20viewBox%3D%220%200%20240%20240%22%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%231a2b4a%22%20stroke-linecap%3D%22round%22%20opacity%3D%220.04%22%3E%3Cpath%20d%3D%22M-10%2040C40%2018%2078%2066%20120%2044s86%2026%20132%204%22%20stroke-width%3D%222.2%22%2F%3E%3Cpath%20d%3D%22M-10%2096C48%2078%2070%20122%20126%20108s78%2016%20126%20-6%22%20stroke-width%3D%221.2%22%2F%3E%3Cpath%20d%3D%22M-10%20168C36%20150%2084%20188%20132%20168s76%2022%20120%202%22%20stroke-width%3D%222.6%22%2F%3E%3Cpath%20d%3D%22M-10%20214C44%20200%2076%20232%20130%20220s84%208%20122%20-10%22%20stroke-width%3D%221%22%2F%3E%3Cpath%20d%3D%22M46%20-10c14%2040%20-8%2066%206%20104%22%20stroke-width%3D%220.9%22%2F%3E%3Cpath%20d%3D%22M186%2020c-10%2046%2012%2072%202%20116%22%20stroke-width%3D%220.9%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") !important;
  background-repeat: repeat;
  background-size: 240px 240px;
  background-position: center top;
}
[data-elementor-type="wp-page"] > .e-con:not(:first-of-type):not(:has(.kadima-mark-cta)):not(:has(.kadima-bandmedia)):not(:has(.kadima-claims)):not(:has(.kadima-splitband)):not(:has(.kadima-cert)):not(:has(.kadima-tira)):not(:has(.kadima-hero-media)):not(:has(.kadima-trustbar)):nth-of-type(6n + 6) {
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22180%22%20height%3D%22180%22%20viewBox%3D%220%200%20180%20180%22%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%231a2b4a%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20opacity%3D%220.038%22%3E%3Cpath%20d%3D%22M90%20119l3.0%200.0%22%2F%3E%3Cpath%20d%3D%22M101%20162l7.5%206.6%22%2F%3E%3Cpath%20d%3D%22M148%20133l1.1%207.9%22%2F%3E%3Cpath%20d%3D%22M87%20140l-3.3%205.0%22%2F%3E%3Cpath%20d%3D%22M170%2039l-3.8%201.1%22%2F%3E%3Cpath%20d%3D%22M1%2082l10.0%204.6%22%2F%3E%3Cpath%20d%3D%22M48%2053l3.7%208.2%22%2F%3E%3Cpath%20d%3D%22M167%2060l-2.0%206.7%22%2F%3E%3Cpath%20d%3D%22M70%20139l-4.2%202.6%22%2F%3E%3Cpath%20d%3D%22M81%202l3.0%200.5%22%2F%3E%3Cpath%20d%3D%22M128%20153l6.4%207.7%22%2F%3E%3Cpath%20d%3D%22M67%20160l-0.1%208.0%22%2F%3E%3Cpath%20d%3D%22M150%2059l-4.0%204.5%22%2F%3E%3Cpath%20d%3D%22M161%20102l-4.0%200.5%22%2F%3E%3Cpath%20d%3D%22M28%2073l9.1%206.2%22%2F%3E%3Cpath%20d%3D%22M147%2080l2.3%208.7%22%2F%3E%3Cpath%20d%3D%22M50%20159l-3.1%206.3%22%2F%3E%3Cpath%20d%3D%22M61%2022l-4.6%202.0%22%2F%3E%3Cpath%20d%3D%22M108%20173l2.9%200.9%22%2F%3E%3Cpath%20d%3D%22M47%200l5.2%208.6%22%2F%3E%3Cpath%20d%3D%22M130%2079l-1.4%207.9%22%2F%3E%3Cpath%20d%3D%22M141%20122l-4.7%203.8%22%2F%3E%3Cpath%20d%3D%22M8%2093l4.0%200.1%22%2F%3E%3Cpath%20d%3D%22M127%20100l8.0%207.5%22%2F%3E%3Cpath%20d%3D%22M30%20179l0.9%209.0%22%2F%3E%3Cpath%20d%3D%22M41%2042l-4.0%205.7%22%2F%3E%3Cpath%20d%3D%22M88%2013l-4.9%201.2%22%2F%3E%3Cpath%20d%3D%22M27%2020l2.7%201.4%22%2F%3E%3Cpath%20d%3D%22M110%2099l3.7%209.3%22%2F%3E%3Cpath%20d%3D%22M121%20142l-2.6%207.6%22%2F%3E%3Cpath%20d%3D%22M168%20113l-5.2%203.0%22%2F%3E%3Cpath%20d%3D%22M107%20120l3.9%200.8%22%2F%3E%3Cpath%20d%3D%22M10%2019l6.8%208.7%22%2F%3E%3Cpath%20d%3D%22M21%2062l-0.5%209.0%22%2F%3E%3Cpath%20d%3D%22M68%2033l-4.9%205.0%22%2F%3E%3Cpath%20d%3D%22M7%2040l-5.0%200.4%22%2F%3E%3Cpath%20d%3D%22M90%20119l2.4%201.8%22%2F%3E%3Cpath%20d%3D%22M101%20162l2.2%209.7%22%2F%3E%3Cpath%20d%3D%22M148%20133l-3.8%207.1%22%2F%3E%3Cpath%20d%3D%22M87%20140l-5.6%202.2%22%2F%3E%3Cpath%20d%3D%22M170%2039l3.8%201.4%22%2F%3E%3Cpath%20d%3D%22M1%2082l5.3%209.6%22%2F%3E%3Cpath%20d%3D%22M48%2053l-1.9%208.8%22%2F%3E%3Cpath%20d%3D%22M167%2060l-5.6%204.2%22%2F%3E%3Cpath%20d%3D%22M70%20139l5.0%200.3%22%2F%3E%3Cpath%20d%3D%22M81%202l2.1%202.1%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") !important;
  background-repeat: repeat;
  background-size: 180px 180px;
  background-position: center top;
}

/* ============================================================
   4Z. Movimiento en el texto: parrafos, titulos de ficha y enlaces
   ============================================================
   Se suma a lo que ya habia, no lo reemplaza. Las piezas que ya entraban con
   kadimaEntra (claim, tile, svc, step, card, work, badges, FAQ, chips) siguen
   igual; lo que se agrega es el nivel de adentro, o sea el texto.

   Tres gestos distintos, uno por rol:
     parrafo de prosa   fade solo, sin desplazamiento
     titulo de ficha    entra desde la izquierda
     enlace de accion   entra desde la derecha

   El parrafo va con fade puro a proposito. Un bloque de texto largo que ademas
   se desplaza obliga al ojo a reencontrar el renglon, y en una pagina con
   varios parrafos seguidos se lee como inestabilidad. Los otros dos son piezas
   cortas de una o dos lineas, donde el desplazamiento si se lee como intencion.

   Los 12px de desplazamiento no son un numero de gusto: un transform genera
   overflow de scroll aunque no genere reflow, asi que un titulo pegado al
   borde izquierdo a 390px de ventana puede empujar la barra horizontal. Se
   midio el desborde en 8 paginas a 390 y a 1440 despues de aplicar esto.

   Sobre la trampa de 4H.6: una animacion de scroll con fill: both que termina
   en transform: none deja fijado ese transform y mata cualquier otro que el
   elemento declare. Por eso ninguno de estos tres apunta a un elemento que
   tenga transform en hover. Se listaron todos los que lo tienen antes de
   escribir esto: claim, tile, svc, card, svcard, icons > li y varias img de
   hover. Aca se anima el h3 o el h4 de adentro de la ficha, nunca la ficha, y
   el parrafo p.kadima-more que envuelve al enlace, nunca el enlace, asi que el
   <a> conserva su transform libre para el dia que se le quiera dar uno. */

@keyframes kadimaFadeTexto {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes kadimaDesdeIzq {
  from { opacity: 0; transform: translateX(-12px); }
  to   { opacity: 1; transform: none; }
}
@keyframes kadimaDesdeDer {
  from { opacity: 0; transform: translateX(12px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {

    /* Parrafos de prosa. Solo los hijos directos de .kadima-prose, que es el
       cuerpo de texto de la seccion. Los parrafos de adentro de una ficha no
       entran: su ficha ya anima entera y animar las dos capas embarra. */
    .kadima-prose > p {
      animation: kadimaFadeTexto linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 34%;
    }
    .kadima-prose > p:nth-child(2) { animation-range: entry 3% entry 37%; }
    .kadima-prose > p:nth-child(3) { animation-range: entry 6% entry 40%; }
    .kadima-prose > p:nth-child(n + 4) { animation-range: entry 9% entry 43%; }

    /* Titulos de ficha, desde la izquierda. */
    .kadima-claim > h3,
    .kadima-svc > h3,
    .kadima-vs > h3,
    .kadima-easystep > h3,
    .kadima-lf > h3,
    .kadima-card > h4 {
      animation: kadimaDesdeIzq linear both;
      animation-timeline: view();
      animation-range: entry 2% entry 40%;
    }

    /* Enlaces de accion, desde la derecha. Se anima el parrafo que envuelve al
       enlace y no el enlace. */
    p.kadima-more {
      animation: kadimaDesdeDer linear both;
      animation-timeline: view();
      animation-range: entry 5% entry 45%;
    }
  }
}

/* ============================================================
   5H. "Why Kadima Contruction": foto real a la izquierda, puntos a la derecha
   ============================================================
   Reemplaza al pase 5G, que habia puesto la foto de fondo a sangre con el texto
   encima. Se vuelve al layout dividido, que es el que ya daba 4P.3 y que existe
   porque el cliente reporto que con texto sobre foto "los iconos con texto se
   pierden".

   Y ese layout NO se reescribe: se midio que 4P.3 ya coloca la foto en la
   columna 1 a 720px y la lista en la columna 2 a 720px, o sea exactamente las
   dos mitades pedidas, con el navy solido detras del texto. Asi que este bloque
   no toca ni la grilla ni las columnas ni el apilado de movil: lo unico que
   hace falta es encuadrar ESTA foto, que es lo que 4P.3 no puede saber.

   El encuadre. La foto es vertical, 2048x3068, y la ranura mide 720 de ancho
   por el alto que le fije la columna de texto, que con cinco puntos ronda los
   1000px. La proporcion de la ranura queda cerca de la de la foto, asi que
   cover recorta poco, pero el operario esta en la mitad inferior del cuadro y
   con el centrado por defecto el recorte se lo come. object-position lo baja. */

[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate--foto > img {
  object-position: center 62%;
}

/* El degradado de 4P.3 funde el borde EXTERIOR de la foto contra el navy. Con
   la foto a la izquierda y el panel navy a la derecha, la costura entre los dos
   es el borde derecho de la foto, asi que el degradado se invierte para estas 9
   y funde por donde de verdad se tocan. Las otras 16 secciones conservan el
   suyo, que es la misma regla sin el modificador. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate--foto::after {
  background: linear-gradient(to right, transparent 55%, var(--e-global-color-ink) 100%);
}
@media (max-width: 900px) {
  /* Apilado: foto arriba, puntos abajo. Lo resuelve 4P.3, que pasa la grilla a
     una columna y le da a la foto una proporcion 16/10. Aca solo se repone el
     degradado vertical, porque la cadena con modificador de arriba le gana a la
     de 4P.3 tambien dentro del corte: una media query no agrega especificidad. */
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate--foto::after {
    background: linear-gradient(to bottom, transparent 55%, var(--e-global-color-ink) 100%);
  }
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-claims) .kadima-claims__plate--foto > img {
    object-position: center 45%;
  }
}

/* ============================================================
   5A. "What Our Clients Say": tarjetas de resena
   ============================================================
   ESTRUCTURA VACIA A PROPOSITO. El contenido de las resenas lo trae el cliente
   desde su ficha de Google. No se invento ni una sola: una resena falsa en un
   sitio de contratista es un problema legal y ademas rompe la regla del
   proyecto de que solo se publica material verificable.

   Cada tarjeta espera este markup:

     <li class="kadima-review">
       <p class="kadima-review__stars" role="img" aria-label="5 out of 5 stars">
         <svg class="kadima-star" ...>...</svg>  (cinco)
       </p>
       <blockquote class="kadima-review__text"><p>...</p></blockquote>
       <p class="kadima-review__who"><strong>Nombre</strong><span>Zona</span></p>
     </li>

   Las estrellas van como SVG y no como caracter, por dos razones: el glifo
   estrella se dibuja distinto en cada sistema y no se le puede fijar el color
   de forma confiable, y un lector de pantalla leeria cinco veces "estrella
   negra". Con SVG el color es el bronce de la marca y la lectura accesible la
   da un solo aria-label en el contenedor, con los SVG marcados como
   decorativos. */

.kadima-reviews {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  /* Cada tarjeta a su altura, no estirada a la de la fila. Las resenas reales
     miden entre 34 y 590 caracteres, asi que con el stretch por defecto la de
     Roshel quedaba con unos 400px de cream vacio debajo de dos renglones de
     texto, y una tarjeta casi vacia se lee como que falta algo. */
  align-items: start;
  gap: 22px;
  width: 100%;
  max-width: none;
}
.kadima-review {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin: 0;
  padding: 26px 24px;
  min-width: 0;
  /* Cream fijo y no --k-box. La caja del sistema se invierte contra el fondo de
     su seccion, y aca la seccion se marca como surface justamente para que la
     tarjeta pueda ser cream sobre blanco, que es lo pedido. */
  background: var(--e-global-color-bg);
  border: 1px solid var(--e-global-color-border);
  border-radius: var(--k-card-radius);
  box-shadow: var(--k-card-shadow);
}
.kadima-review__stars {
  display: flex;
  gap: 3px;
  margin: 0;
  line-height: 0;
}
.kadima-star {
  width: 17px;
  height: 17px;
  flex: 0 0 auto;
  fill: var(--e-global-color-accent);
}
.kadima-review__text {
  margin: 0;
  padding: 0;
  border: 0;
}
.kadima-review__text > p {
  margin: 0;
  font-size: 15.5px;
  line-height: 1.6;
  color: var(--e-global-color-muted);
}
/* Quien firma, arriba de la cita: avatar, nombre y estrellas. */
.kadima-review__head {
  display: flex;
  align-items: center;
  gap: 12px;
}
/* La inicial se dibuja con content: attr() y NO va como texto en el DOM. Si
   fuera un nodo de texto, la letra suelta se sumaria al texto visible de la
   pagina y un lector de pantalla leeria "J Jacqueline Liburd". Asi el avatar es
   decoracion pura y el nombre se lee una sola vez. */
.kadima-review__avatar {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  background: var(--e-global-color-ink);
  color: var(--e-global-color-bg);
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 17px;
  font-weight: 700;
  line-height: 1;
  user-select: none;
}
.kadima-review__avatar::before { content: attr(data-inicial); }
.kadima-review__meta {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.kadima-review__name {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15.5px;
  font-weight: 700;
  line-height: 1.25;
  color: var(--e-global-color-ink);
}

/* MIENTRAS NO HAYA RESENAS REALES, LA SECCION NO SE MUESTRA.
   No es una decision de gusto. El hueco reservado de /reviews/ lleva escrito en
   su propio markup, desde antes de esta pasada, que ese espacio "stays EMPTY,
   never filled with placeholder content, star ratings or stock quotes", por la
   Decision 7.1: sin ficha de Google poblada no se publica ni una estrella ni un
   dato de rating. Una fila de cinco estrellas doradas sin una resena detras es
   exactamente lo que esa decision prohibe, y en la home ademas anunciaria en la
   pagina mas visitada que el negocio no tiene resenas.

   Asi que la estructura queda montada y muda: la cadena mira si la lista tiene
   al menos una tarjeta, y si no la tiene esconde la seccion entera. El dia que
   se peguen las resenas del cliente adentro del <ul>, las dos secciones
   aparecen solas, sin tocar CSS ni volver a tocar Elementor.

   El markup exacto de cada tarjeta esta como comentario dentro del propio
   widget, en /reviews/ y en la home. */
/* OJO con la forma de esta cadena. El primer intento fue
     .e-con:has(.kadima-reviews:not(:has(.kadima-review)))
   y no funciona: CSS NO permite :has() anidado dentro de otro :has(). La cadena
   entera queda invalida y la regla se descarta en silencio, o sea que la
   seccion vacia se veia igual. Comprobado en vivo con CSS.supports, no
   deducido: la forma anidada da false y la forma con hijo directo da true.
   La forma correcta son dos reglas de un solo nivel: se esconde toda seccion
   que tenga la grilla, y se vuelve a mostrar la que ademas tenga al menos un
   <li> adentro. La segunda gana por especificidad, (0,1,1) contra (0,1,0), no
   por orden. El display: flex repone el valor propio del contenedor de
   Elementor, medido en vivo. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-reviews) {
  display: none;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-reviews > li) {
  display: flex;
}

@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .kadima-review {
      animation: kadimaEntra linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 40%;
    }
    .kadima-reviews > .kadima-review:nth-child(3n + 2) { animation-range: entry 4% entry 44%; }
    .kadima-reviews > .kadima-review:nth-child(3n + 3) { animation-range: entry 8% entry 48%; }
  }
  .kadima-review { transition: transform .18s ease, box-shadow .18s ease; }
  .kadima-review:hover { transform: translateY(-2px); box-shadow: 0 14px 30px rgba(26, 43, 74, .14); }
}

/* Los cortes repiten la cadena completa, no solo .kadima-reviews: una media
   query no agrega especificidad, asi que si alguna regla de arriba usara :has
   sobre esta grilla, nombrar solo la clase pelada perderia el empate. Hoy no la
   usa, pero la regla del proyecto es dejarlo listado igual. */
@media (max-width: 1024px) {
  .kadima-reviews { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 767px) {
  .kadima-reviews {
    grid-template-columns: minmax(0, 1fr);
    gap: 16px;
  }
  .kadima-review { padding: 22px 20px; }
}

/* ---------- 5C. Variante compacta de la galeria ----------
   La misma grilla de /projects/ reusada dentro de las 8 paginas de servicio,
   con 8 fotos y sin encabezado propio: el h2 lo pone el widget de Elementor de
   la seccion, igual que en el resto de esas paginas.

   Por que las tres cadenas de 4V.2 y 4V.3 pasan a decir
   :not(.kadima-work--compacta): esas reglas estiran el widget del h2 y le
   corren el filete a la izquierda, que es correcto en /projects/, donde toda la
   pagina esta alineada a la izquierda. En las paginas de servicio los H2 van
   centrados, y medido antes de tocar nada, /bathroom-remodeling/ tenia UN solo
   filete a la izquierda, el de su banda con foto. Sin esta exclusion la seccion
   nueva habria quedado como la unica desalineada de la pagina.

   La grilla no necesita CSS propio: hereda --kw-cols y --kw-gap de .kadima-work
   y todo el tratamiento de .kadima-work__item, __frame y su hover ya existe. */
.kadima-work--compacta > .kadima-work__grid {
  margin-bottom: 26px;
}

/* ============================================================
   5D. "The Two Decisions": las dos fichas al mismo ancho, con foto
   ============================================================
   El problema medido: la grilla de longform es de dos columnas, pero la regla
   de la linea 1403 le da grid-column: 1 / -1 a todo bloque que contenga un
   <ul>, y la segunda ficha tiene uno. O sea que la primera quedaba a media
   columna con la otra mitad vacia y la segunda a ancho completo. Eso es el
   espacio vacio raro del reporte, y no se arregla igualando anchos de columna:
   hay que sacar las dos del reparto de dos columnas.

   Ahora las dos van a ancho completo, una debajo de la otra, y cada una se
   divide por dentro en icono, texto y foto. Asi las dos miden lo mismo, ninguna
   deja hueco, y la foto llena el alto que sobre en la ficha corta.

   La foto NO usa la clase kadima-lf__foto, que ya existe pero pertenece a la
   linea de tiempo de "Our Story" en /about/ (4U.3) y dispara un layout de tres
   columnas con linea central. Se usa kadima-lf__shot, propia.

   En movil la foto pasa debajo del texto, cruzando las dos columnas del bloque,
   que es lo pedido. */

.kadima-lf__grid:has(> .kadima-lf__block > .kadima-lf__shot) {
  grid-template-columns: minmax(0, 1fr);
}
.kadima-lf__block:has(> .kadima-lf__shot) {
  grid-column: 1 / -1;
  grid-template-columns: 24px minmax(0, 1fr) 320px;
  /* Filas EXPLICITAS. Sin ellas la foto no puede abarcar el bloque: -1 cuenta
     desde el final de la grilla explicita y, sin filas declaradas, se resuelve
     a la linea 1, o sea que la foto cae en la fila del h3 y lo empuja. El
     intento de esquivarlo con span 99 fue peor: la grilla creo 99 filas
     implicitas y sus 98 row-gap estiraron cada ficha a 1233px de alto.
     Tres filas alcanzan: la ficha corta usa dos (h3, parrafo) y la larga tres
     (h3, lista, parrafo). La fila sobrante de la corta mide 0. */
  grid-template-rows: repeat(3, auto);
  column-gap: 24px;
}
/* align-content se queda en start, que es lo que trae .kadima-lf__block de la
   linea 1380. El primer intento lo puso en stretch pensando que asi la foto
   llenaba el alto, y lo que hizo fue repartir el sobrante ENTRE las filas: en
   la ficha corta quedaba un hueco de 240px entre el h3 y el parrafo. La foto
   ya llena el alto por su cuenta, con grid-row 1 / -1 mas align-self: stretch. */
/* El texto ya no necesita su tope de 58ch: la columna de la foto le fija el
   ancho, y con el tope quedaba una segunda franja vacia adentro de la ficha. */
.kadima-lf__block:has(> .kadima-lf__shot) > p,
.kadima-lf__block:has(> .kadima-lf__shot) > ul {
  max-width: none;
}
/* La foto abarca todas las filas del bloque, y su <img> tiene altura
   intrinseca. Eso es exactamente la trampa que documenta CLAUDE.md: la altura
   del contenido de un item que abarca varias filas se REPARTE entre todas las
   filas que abarca, asi que en la ficha corta quedaba un hueco de 240px entre
   el h3 y el parrafo. min-height: 0 no lo arregla, y align-content: start
   tampoco: se probaron los dos. Lo que lo arregla es sacar la imagen del flujo
   con position: absolute, que es la receta del propio CLAUDE.md. La caja la
   sigue dimensionando la columna de texto y el recorte lo hace object-fit. */
.kadima-lf__shot {
  position: relative;
  grid-column: 3;
  grid-row: 1 / -1;
  align-self: stretch;
  margin: 0;
  min-height: 220px;
  border-radius: 4px;
  overflow: hidden;
  background: var(--e-global-color-border);
}
.kadima-lf__shot > img {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

@media (prefers-reduced-motion: no-preference) {
  .kadima-lf__shot > img { transition: transform .5s cubic-bezier(.2, .6, .2, 1); }
  .kadima-lf__block:has(> .kadima-lf__shot):hover .kadima-lf__shot > img { transform: scale(1.04); }
}

/* El corte repite la cadena con :has entera. Una media query no agrega
   especificidad y sin repetirla las reglas de arriba ganarian el empate. */
@media (max-width: 900px) {
  .kadima-lf__block:has(> .kadima-lf__shot) {
    grid-template-columns: 24px minmax(0, 1fr);
    column-gap: 16px;
  }
  .kadima-lf__block:has(> .kadima-lf__shot) > .kadima-lf__shot {
    grid-column: 1 / -1;
    grid-row: auto;
    margin-top: 18px;
    aspect-ratio: 16 / 10;
    min-height: 0;
  }
  /* En movil la foto ya no abarca filas, asi que la imagen puede volver al
     flujo. Se deja igual en absoluto: con aspect-ratio en el contenedor el
     resultado es el mismo y hay una regla menos que mantener. */
}

/* ============================================================
   5E. Los chips de zona, ahora tambien en las 8 paginas de servicio
   ============================================================
   La seccion "Service areas" de las paginas de servicio era prosa plana: una
   frase y un enlace. Pasa a llevar los mismos 12 chips que "Where We Work" de
   la home, con la diferencia de que aca SI son clickeables los que tienen
   pagina propia.

   Sobre la decision contraria de la home. El bloque 4Q.1 dice que sus 12 chips
   no son enlaces a proposito, y da el motivo: siete zonas tienen pagina y cinco
   no, asi que "enlazar solo algunos deja una fila visualmente despareja". Ese
   motivo se atiende de otra forma en vez de descartar el pedido: el chip
   enlazado hereda EXACTAMENTE la misma pinta que el suelto, sin subrayado, sin
   color de enlace y sin cambio de peso, asi que en reposo la fila es perfecta
   mente uniforme. Lo unico que los distingue es que el enlazado responde al
   hover y al foco. La lista sigue siendo de 12 y en el mismo orden que la home,
   que a su vez tiene que coincidir con el areaServed del JSON-LD.

   Las 7 con pagina, verificadas por HTTP 200 una por una, son Queens,
   Westchester County, The Bronx, Bronxville, New Rochelle, Scarsdale y White
   Plains. Las otras 5 (Rye, Harrison, Purchase, Larchmont y Pelham) dan 404 y
   quedan como chip suelto. */

/* El chip enlazado NO usa margen negativo. El primer intento le dejaba al <li>
   su padding y se lo compensaba al <a> con margin negativo, y las dos cosas
   peleaban: con padding 0 en el <li> el margen negativo lo encogia a 20px
   mientras el suelto media 36. Medido a 390px. Ahora el padding lo pone el <a>
   y el <li> solo aporta el borde y el radio, que es lo unico que necesita. */
ul.kadima-areas > li > a {
  display: block;
  padding: 9px 16px;
  border-radius: 999px;
  color: inherit;
  font: inherit;
  text-decoration: none;
  background-image: none;
  transition: background-color .18s ease, color .18s ease;
}
ul.kadima-areas > li:has(> a) {
  padding: 0;
  overflow: hidden;
}
@media (prefers-reduced-motion: no-preference) {
  ul.kadima-areas > li:has(> a) { transition: border-color .18s ease; }
}
/* El hover invierte el chip: navy de fondo y cream encima, 13.3:1, el mismo par
   que ya usa el sitio en las bandas oscuras. El foco visible repite el gesto y
   suma el anillo del navegador, que no se toca. */
ul.kadima-areas > li > a:hover,
ul.kadima-areas > li > a:focus-visible {
  background-color: var(--e-global-color-ink);
  color: var(--e-global-color-bg);
}
ul.kadima-areas > li:has(> a:hover) {
  border-color: var(--e-global-color-ink);
}
/* El <a> compensa con margen negativo el padding del chip para llenarlo entero,
   asi que ese margen tiene que seguir al padding en cada corte. El bloque 4Q.1
   baja el chip a 8px 14px en movil; sin repetirlo aca el enlazado quedaba 2px
   mas alto que el suelto y la fila se veia despareja, que es justo lo que este
   diseno queria evitar. Medido a 390px: altura distinta en las 8 paginas. */
@media (max-width: 767px) {
  ul.kadima-areas > li > a { padding: 8px 14px; }
}

/* ---------- 5F. La seccion de resenas va sobre blanco ----------
   Para que la tarjeta pueda ser cream con borde y sombra, como se pidio, la
   seccion tiene que ser blanca: cream sobre cream se apoya solo en el borde y
   se pierde. El marcador de tono va en el markup, igual que en el resto del
   sitio. Se declara aca ademas del marcador porque la cadena de la linea 980
   pinta la seccion pero tambien redefine --k-box, y esa parte no hace falta. */
.kadima-review__text { quotes: none; }

/* ============================================================
   5J. El telefono dentro de una respuesta de FAQ (Punto 7, 2026-09-07)
   ============================================================
   a.kadima-phone es un componente de CTA y de bloque NAP: la regla base de la
   linea 156 lo declara inline-block con min-height 44px y filete bronce, y
   ademas cae en 16px con weight 600. Eso funciona cuando el telefono es una
   pieza suelta. Dentro de una frase corrida no.

   Medido en /faq/ a 1440px, con el telefono ya puesto en la respuesta de
   "How do I get an estimate?":

     el parrafo de la FAQ    18px / 29.7px / weight 400
     a.kadima-phone adentro  16px / 26.4px / weight 600, alto 44px

   O sea: el numero se veia MAS CHICO que la frase que lo rodea, y su caja de
   44px empujaba el alto de la linea donde caia. El parrafo con telefono media
   26.7px por linea contra 34.1px del parrafo hermano sin telefono.

   La cura es la que ya aplico el punto 4 a la prosa de banda oscura (linea
   2414): la tipografia se hereda de la frase. Se agrega display inline y
   min-height 0, que ahi no hacian falta porque ese caso no tenia el problema
   de la caja.

   Lo que NO se toca: el filete bronce de 2px y su padding-bottom de 2px. Es la
   senal de "esto es un telefono" en todo el sitio, y distingue al numero de
   los enlaces internos de la misma respuesta, que van subrayados. Medido: el
   enlace preexistente de la FAQ y el enlace externo nuevo salen los dos en
   18px Inter subrayado, o sea que el telefono es lo unico que desafinaba.

   Sobre el area de toque: la regla base pedia 44px de alto para el telefono
   suelto. Aca el numero es un enlace inline dentro de una oracion, del mismo
   alto que cualquier otro enlace inline del parrafo, y mide unos 120px de
   ancho. Inflarlo verticalmente con padding movia el filete bronce lejos del
   numero, que es peor. */
.kadima-faq details > p a.kadima-phone {
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  line-height: inherit;
  display: inline;
  min-height: 0;
}

/* ============================================================
   5K. El formulario de GoHighLevel: RETIRADO (2026-09-24)
   ============================================================
   El embed de GHL se reemplazo por un formulario nativo de Elementor Pro que
   envia por correo. Con el se fueron las dos curitas que este bloque habia
   necesitado: el recorte de la cola vacia del iframe, cuyas reglas ya se
   habian sacado el 2026-09-08 cuando arreglaron el formulario en la cuenta de
   GHL, y todo el andamiaje de .kadima-ghl-form.

   La medicion completa de aquel problema (1152 px de caja vacia adentro del
   iframe, el metodo con Page.createIsolatedWorld para leer dentro de un
   iframe cross-origin, y por que el tope se eligio self-healing) vive en el
   historial de git y en el pendiente 23 de TRASPASO.md. No se repite aca
   porque ya no describe nada que exista en el sitio.

   El formulario nuevo se estila en el bloque 5P. */

/* ============================================================
   5L. La seccion del formulario pasa a banda con foto (2026-09-08)
   ============================================================
   Se pidio que la seccion del formulario de contacto lleve foto de fondo con
   velo navy, "igual que las kadima-splitband del resto del sitio", y que el
   formulario quede como tarjeta flotando encima.

   Se copia la ESTRUCTURA de kadima-bandmedia y no la de kadima-splitband, a
   proposito. splitband es una banda de texto a la izquierda con la foto
   asomando a la derecha, y su velo es horizontal a 100deg justamente por eso.
   Aca el contenido es una tarjeta de 720px CENTRADA mas un H2 centrado, o sea
   que ocupa el ancho entero: un velo horizontal dejaria la mitad derecha de la
   tarjeta sobre la parte clara de la foto y la izquierda sobre la oscura, sin
   ninguna razon de composicion.

   El velo es el VERTICAL que el propio kit ya usa para splitband en movil
   (0.92 / 0.90 / 0.86, linea 2295), y por el mismo motivo que ahi: cuando el
   contenido ocupa todo el ancho, el velo tiene que ser parejo de arriba abajo.
   O sea que no es un gradiente inventado: es una de las dos formulas que ya
   estaban medidas en este archivo, aplicada al caso que le corresponde.

   Contraste. El piso del velo es 0.86 de navy. La medicion de 4P.2 fijo que
   0.70 de navy sobre el peor caso posible, foto blanca pura, da exactamente
   4.5:1 con cream. 0.86 queda muy por encima de ese piso, asi que el H2 cream
   no puede bajar de AA por mas clara que sea la foto. La foto elegida
   (kadima-real-kitchen-03, cocina terminada real) es de las claras, y aun asi
   medido sobre la pagina da bastante margen.

   ORDEN DE APILAMIENTO, que es donde este archivo ya se equivoco tres veces:
     la foto      z-index 0, fuera de flujo
     el velo      z-index 1, en el ::before de la seccion
     el contenido z-index 2

   La regla que 4I.2 dejo escrita y que hay que respetar: el elemento que
   envuelve a la foto NO puede crear contexto de apilamiento propio, porque
   entonces el z-index de la foto compite dentro de esa burbuja y pinta encima
   del ::before de la seccion, que vive afuera. Por eso la foto va en su PROPIO
   widget y es ese widget el que sale de flujo, en vez de meter la figure en el
   widget del formulario: si la figure viviera ahi, el widget del formulario
   tendria que ser relative para subir la tarjeta sobre el velo, y entonces el
   inset:0 de la figure se resolveria contra el widget y no contra la seccion,
   con la foto encerrada en la caja del formulario.

   El ::before de la seccion no estaba tomado: esta seccion no es splitband ni
   claims ni bandmedia, y no la alcanza ninguna de las reglas de separador
   entre bandas, que nombran marcadores uno por uno. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--e-global-color-ink);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband)::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg,
    rgba(26, 43, 74, .92) 0%,
    rgba(26, 43, 74, .90) 60%,
    rgba(26, 43, 74, .86) 100%);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) > .e-con-inner > * {
  position: relative;
  z-index: 2;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) > .e-con-inner > .elementor-widget:has(> .kadima-formband__media) {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  max-width: none;
  margin: 0;
}
.kadima-formband__media {
  margin: 0;
  width: 100%;
  height: 100%;
}
.kadima-formband__media > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) > .e-con-inner > .elementor-widget-heading .elementor-heading-title {
  color: var(--e-global-color-bg);
}

/* ============================================================
   5M. kadima-legal: el cuerpo de las paginas legales (2026-09-09)
   ============================================================
   Para /privacy-policy/ y /terms-and-conditions/. El contenido llego dentro de
   un HTML generico con su propio diseno; de ahi se tomo SOLO el texto y la
   division en secciones, y el aspecto sale de aca, con las variables del kit.

   Medida de lectura: 820px. Mas anchas que las 720 de kadima-prose porque son
   paginas de lectura larga con listas, y mas angostas que las 960 del intro de
   seccion, que es una linea suelta y no un documento.

   El numeral de cada seccion va en bronce y en la tipografia de acento, no en
   Playfair: es una etiqueta, no un titulo. Se marca aria-hidden porque el
   lector de pantalla ya anuncia el encabezado y "cero uno" antes del titulo es
   ruido. El numero sigue estando en el texto de la seccion 07, que remite a la
   seccion 10, asi que la referencia no se pierde.

   El H1 de estas paginas lleva filo bronce. El kit se lo da automaticamente a
   los H2 del cuerpo pero no a los H1, porque en el resto del sitio el H1 vive
   sobre la foto del hero y ahi el filo no hace falta. Estas paginas no tienen
   hero con foto, asi que el filo es lo que las hace verse de la misma familia.
   Se copian las medidas exactas de la regla de H2: 44px de ancho, 3px de alto,
   centrado.

   Las dos cajas destacadas se distinguen por color de borde y no por fondo:
     borde bronce, .kadima-legal__aviso  para avisos importantes
     borde navy,   .kadima-legal__datos  para los bloques de proteccion de datos
   Las dos van sobre surface (blanco puro) para separarse del cream de la
   seccion sin introducir un color nuevo.

   Sobre el telefono: a.kadima-phone es un componente de CTA y trae
   inline-block con min-height 44px y 16px de cuerpo. Adentro de texto corrido
   desalinea la linea y la agranda. Es la TERCERA vez que aparece en el
   proyecto: primero en la prosa de banda oscura (linea 2414), despues en una
   respuesta de FAQ (bloque 5J), y ahora aca.

   La primera version de este bloque solo lo curo en la lista de la banda de
   contacto, y el defecto reaparecio en el cuerpo de Terms, donde el telefono
   va adentro de un parrafo. Medido antes de corregir: el telefono a 16px con
   caja de 44px dentro de un parrafo de 17px/28.9px, que subia el parrafo a
   103px cuando sus tres lineas miden 87. Por eso la regla ahora nombra
   .kadima-legal a.kadima-phone y cubre el componente entero, no un solo lugar
   adentro de el.

   ESPECIFICIDAD, tres peleas que se midieron con getMatchedStylesForNode y no
   se adivinaron. Elementor compila los ajustes de tipografia del kit como
   .elementor-kit-5 h2 y .elementor-kit-5 h3, que son (0,1,1), y esas reglas van
   DESPUES del custom_css en post-5.css. O sea que una regla mia de una sola
   clase pierde por especificidad, y una de igual especificidad pierde por orden.

   1. .kadima-legal__h era (0,1,0) y .elementor-kit-5 h2 le imponia 38px donde
      este bloque pedia 30. Se sube a .kadima-legal h2.kadima-legal__h, (0,2,1).
   2. .kadima-legal__avisoh era (0,1,0) y la ganaba .kadima-legal p, (0,1,1),
      que es una regla de ESTE MISMO bloque: el titulo de la caja bronce salia a
      17px en vez de 22. Se sube a .kadima-legal p.kadima-legal__avisoh.
   3. El h3 lo gana la regla del sitio
      [data-elementor-type="wp-page"] > .e-con:not(:first-of-type) h3, que es
      (0,3,1) y da clamp(18px, 1.4vw, 22px). Ahi NO se pelea: ese clamp es el
      tratamiento de h3 del cuerpo en todo el sitio y respetarlo es justamente
      lo que hace que estas paginas se vean de la familia. Se saca el font-size
      de aca y se dejan family, weight y color, que si ganan.

   Los tres cambios se repiten dentro de cada breakpoint que toca esas
   propiedades: una media query no agrega especificidad, asi que nombrar la
   clase corta ahi habria vuelto a perder. Es la misma trampa que CLAUDE.md
   documenta para :has(). */
.kadima-legal {
  width: 100%;
  max-width: 820px;
  margin: 0 auto;
}
.kadima-legal__sec + .kadima-legal__sec {
  border-top: 1px solid var(--e-global-color-border);
  margin-top: 38px;
  padding-top: 38px;
}
.kadima-legal h2.kadima-legal__h {
  display: flex;
  gap: 14px;
  align-items: baseline;
  margin: 0 0 18px;
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 30px;
  font-weight: 600;
  line-height: 1.25;
  color: var(--e-global-color-ink);
}
.kadima-legal__n {
  flex: 0 0 auto;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: .08em;
  color: var(--e-global-color-accent-text);
}
.kadima-legal h3 {
  margin: 26px 0 10px;
  font-family: var(--e-global-typography-secondary-font-family), sans-serif;
  font-weight: 600;
  line-height: 1.4;
  color: var(--e-global-color-ink);
}
.kadima-legal p {
  margin: 0 0 14px;
  font-size: 17px;
  line-height: 1.7;
  color: var(--e-global-color-muted);
}
.kadima-legal p:last-child { margin-bottom: 0; }
.kadima-legal strong { font-weight: 600; color: var(--e-global-color-ink); }
.kadima-legal a { color: var(--e-global-color-accent-text); }
.kadima-legal ul {
  margin: 0 0 16px;
  padding: 0;
  list-style: none;
}
.kadima-legal ul > li {
  position: relative;
  margin: 0 0 8px;
  padding-left: 22px;
  font-size: 17px;
  line-height: 1.7;
  color: var(--e-global-color-muted);
}
.kadima-legal ul > li::before {
  content: "";
  position: absolute;
  left: 4px;
  top: 11px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--e-global-color-accent);
}
.kadima-legal__nota {
  border-left: 3px solid var(--e-global-color-border);
  padding-left: 16px;
}
/* caja de aviso importante: borde bronce */
.kadima-legal__aviso {
  margin: 0 0 36px;
  padding: 26px 28px;
  border: 2px solid var(--e-global-color-accent);
  border-radius: 4px;
  background: var(--e-global-color-surface);
}
.kadima-legal p.kadima-legal__avisoh {
  margin: 0 0 12px;
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 22px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--e-global-color-ink);
}
/* caja de proteccion de datos: borde navy */
.kadima-legal__datos {
  margin: 24px 0 0;
  padding: 22px 24px;
  border: 2px solid var(--e-global-color-ink);
  border-radius: 4px;
  background: var(--e-global-color-surface);
}
/* el bloque de SMS de Terms va destacado, sin numeral */
.kadima-legal__sec--sms .kadima-legal__aviso { margin: 24px 0; }
/* la fecha de vigencia, arriba */
.kadima-legal__fecha {
  margin: 0;
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  text-align: center;
  color: var(--e-global-color-accent-text);
}
/* el H1 de estas paginas lleva el mismo filo bronce que los H2 del cuerpo */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-legal) h1.elementor-heading-title {
  position: relative;
  padding-bottom: 22px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-legal) h1.elementor-heading-title::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  width: 44px;
  height: 3px;
  transform: translateX(-50%);
  background: var(--e-global-color-accent);
}
/* la banda de contacto navy */
ul.kadima-legal__contacto {
  margin: 0;
  padding: 0;
  list-style: none;
}
ul.kadima-legal__contacto > li {
  margin: 0 0 8px;
  font-size: 18px;
  line-height: 1.7;
  color: var(--e-global-color-bg);
}
ul.kadima-legal__contacto > li:last-child { margin-bottom: 0; }
ul.kadima-legal__contacto > li > span {
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 24px;
  font-weight: 600;
}
ul.kadima-legal__contacto a { color: var(--e-global-color-bg); }
.kadima-legal a.kadima-phone,
ul.kadima-legal__contacto a.kadima-phone {
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  line-height: inherit;
  display: inline;
  min-height: 0;
}
/* la linea de consentimiento al pie */
.kadima-legal__consent {
  width: 100%;
  max-width: 820px;
  margin: 0 auto;
  font-size: 15px;
  line-height: 1.7;
  text-align: center;
  color: var(--e-global-color-muted);
}
@media (max-width: 767px) {
  .kadima-legal h2.kadima-legal__h { font-size: 25px; gap: 10px; }
  .kadima-legal__sec + .kadima-legal__sec { margin-top: 30px; padding-top: 30px; }
  .kadima-legal__aviso { padding: 20px 20px; margin-bottom: 28px; }
  .kadima-legal p.kadima-legal__avisoh { font-size: 20px; }
  .kadima-legal__datos { padding: 18px 20px; }
  .kadima-legal p,
  .kadima-legal ul > li { font-size: 16px; }
  ul.kadima-legal__contacto > li { font-size: 17px; }
  ul.kadima-legal__contacto > li > span { font-size: 21px; }
}
@media (max-width: 560px) {
  /* el numeral pasa arriba del titulo: a 560px la fila de dos columnas deja el
     titulo en una columna demasiado angosta y parte palabras. Medido. */
  .kadima-legal h2.kadima-legal__h { display: block; font-size: 23px; }
  .kadima-legal__n { display: block; margin-bottom: 6px; }
  .kadima-legal__aviso { padding: 18px 16px; }
  .kadima-legal__datos { padding: 16px 16px; }
}

/* ============================================================
   5N. kadima-social: los tres iconos de redes (2026-09-13)
   ============================================================
   Google Maps, Facebook e Instagram. SVG inline en el markup, en la misma
   convencion que build/icons.json: 24x24, viewBox 0 0 24 24, trazo
   currentColor, sin relleno, stroke-width 1.5. Cero librerias externas.

   Color: bronce, NO los colores de cada marca, que es lo que se pidio. Se usa
   accent-text (#8A6633) y no accent (#A67C3F) porque el footer es cream y el
   bronce oscuro es el que el propio footer ya usa para los encabezados de
   columna. El hover pasa a ink, que es el mismo par que usan los enlaces del
   footer, nada mas que al reves: ahi el reposo es ink y el hover bronce.

   La regla base .kadima-ico (linea 233) fija color: accent, asi que el svg de
   adentro se pone en color: inherit y manda el <a>. Si no, el hover no hacia
   nada: cambiaba el color del enlace y el icono seguia pintando el suyo.

   El <a> mide 44x44 con el glifo de 24 centrado, que da area de toque sin
   inflar el glifo. El margen negativo de 10px en el ul compensa ese padding
   para que el primer icono quede alineado con el texto de arriba y no
   desplazado 10px a la derecha.

   Especificidad: se escribe nav.kadima-social a, que es (0,1,2), porque
   .kadima-nap a (linea 284) es (0,1,1) y le impone color ink al enlace. Con la
   clase sola quedaba a merced del orden del archivo.

   Los iconos se miraron renderizados a 24px y a 20px, sobre navy, sobre cream
   en bronce y sobre cream en navy, antes de subir nada: los tres se leen en
   las seis combinaciones. */
nav.kadima-social {
  margin: 18px 0 0;
}
nav.kadima-social ul {
  display: flex;
  align-items: center;
  gap: 4px;
  margin: 0 0 0 -10px;
  padding: 0;
  list-style: none;
}
nav.kadima-social li { margin: 0; }
nav.kadima-social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  color: var(--e-global-color-accent-text);
  text-decoration: none;
  transition: color .18s ease, opacity .18s ease;
}
nav.kadima-social a:hover,
nav.kadima-social a:focus-visible {
  color: var(--e-global-color-ink);
}
nav.kadima-social .kadima-ico {
  display: block;
  flex: none;
  width: 24px;
  height: 24px;
  color: inherit;
}
/* adentro de la ficha de contacto: la ficha es una caja con 26px de padding en
   sus filas, asi que el bloque se alinea con ellas. Mismo criterio que ya usa
   p.kadima-more adentro de esta misma caja. */
.kadima-spec__list > nav.kadima-social {
  margin: 0;
  padding: 4px 26px 18px;
}

/* ============================================================
   5O. Los iconos de redes tambien en la barra navy del footer (2026-09-14)
   ============================================================
   La barra de "Ready to start?" vive en la plantilla del footer, o sea que
   sale en las 28 paginas. El pedido la llamaba kadima-mark-cta, pero ese es
   otro componente: una seccion navy de PAGINA que solo esta en algunas. La
   barra del footer se reconoce por .kadima-cta-text, y el bloque que empieza
   en "[data-elementor-type=footer] .e-con.e-child:has(.kadima-cta-text)" es
   el que la pinta de navy.

   Por eso la inversion de color NO se hace con una clase modificadora tipo
   kadima-social--invert: esa barra YA invierte por contexto todo lo que
   contiene, el texto, el telefono y el boton, con ese mismo :has(). Los
   iconos siguen la regla de la casa y se invierten igual. Si la barra se
   reusa en otro lado, se invierten solos.

   Cream en reposo y bronce en hover, o sea el par del footer al reves: alla
   el fondo es cream y van bronce con hover a ink. Misma transicion de .18s.

   El filete vertical bronce antes de "Follow our work" solo aparece de 1025px
   para arriba. Mas abajo el contenedor envuelve (flex-wrap: wrap, justify
   center) y el bloque cae a su propia linea, centrado, que es lo que se pidio
   para tablet y movil; ahi un filete a la izquierda quedaria colgando de nada.

   Donde envuelve, medido por el centro vertical de cada hijo y no por su top,
   que con align-items: center difiere entre items de distinta altura y hace
   creer que hay mas filas de las que hay:

     1440 y 1024   una sola fila, los cuatro items
     1000 a 768    dos filas, "Follow our work" solo en la segunda, centrado
     390           cuatro filas, cada una centrada

   O sea que el quiebre esta entre 1024 y 1000. El corte se pone en 1025, que
   ademas es un breakpoint que el kit ya usa, y no en 1001: asi el filete NUNCA
   puede aparecer sobre una linea envuelta. El precio es una franja de unos
   24px de ancho de ventana donde el bloque va en linea sin filete, que es el
   lado inofensivo del error. */
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .kadima-cta-follow {
  display: flex;
  align-items: center;
  gap: 10px;
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .kadima-cta-follow .kadima-cta-text {
  margin: 0;
  white-space: nowrap;
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) nav.kadima-social {
  margin: 0;
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) nav.kadima-social ul {
  margin: 0;
  gap: 0;
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) nav.kadima-social a {
  color: var(--e-global-color-bg);
}
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) nav.kadima-social a:hover,
[data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) nav.kadima-social a:focus-visible {
  color: var(--e-global-color-accent);
}
@media (min-width: 1025px) {
  [data-elementor-type="footer"] .e-con.e-child:has(.kadima-cta-text) .kadima-cta-follow::before {
    content: "";
    width: 1px;
    height: 26px;
    margin-right: 6px;
    background: var(--e-global-color-accent);
  }
}

/* ============================================================
   5P. El formulario nativo de /contact/ (2026-09-24)
   ============================================================
   Reemplaza el embed de GoHighLevel por el widget form de Elementor Pro. La
   seccion es la misma de siempre: foto real de cocina al fondo con el velo
   navy del bloque 5L. Lo que cambia es que adentro va un formulario propio.

   Por que el formulario va en una TARJETA clara y no suelto sobre el navy.
   Medido antes de escribir una linea: sin tarjeta el widget ocupa los 1200px
   del contenedor y sus etiquetas heredan el gris apagado del sitio, que sobre
   navy es ilegible. Y un boton navy, que es el que se pidio, sobre fondo navy
   desaparece. La tarjeta clara resuelve las tres cosas de una y ademas repone
   la composicion que ya tenia la seccion cuando el formulario era un iframe:
   una pieza clara flotando sobre la foto veiada.

   Ancho 820px, el mismo que kadima-legal, que es la medida de lectura larga
   del sitio. El iframe de GHL media 720; 820 da aire a las dos columnas sin
   que el par de campos quede demasiado ancho.

   Colores: todo con variables. Inputs sobre surface con borde border, foco en
   bronce, boton ink con texto bg y hover accent-button, que es el mismo par
   que usa el boton del header. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-widget-form {
  width: 100%;
  max-width: 820px;
  margin: 0 auto;
  padding: 40px;
  border-radius: 4px;
  background: var(--e-global-color-surface);
  box-shadow: 0 22px 48px -28px rgba(8, 14, 26, .55);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-label {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.4;
  color: var(--e-global-color-ink);
  margin-bottom: 6px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-textual {
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 16px;
  line-height: 1.5;
  color: var(--e-global-color-ink);
  background-color: var(--e-global-color-surface);
  border: 1px solid var(--e-global-color-border);
  border-radius: 4px;
  padding: 12px 14px;
  min-height: 48px;
  transition: border-color .18s ease, box-shadow .18s ease;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-textual:focus {
  border-color: var(--e-global-color-accent);
  box-shadow: 0 0 0 3px rgba(166, 124, 63, .18);
  outline: 2px solid transparent;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-textual::placeholder {
  color: var(--e-global-color-muted);
  opacity: 1;
}
/* Los servicios van en checkboxes en linea y no en un select multiple. El
   multiple se dibuja como LISTA abierta: se le habia fijado 204px de alto para
   que entraran las ocho opciones, y aun asi obligaba a saber que hay que
   apretar Ctrl para elegir dos. Medido despues del cambio: el grupo pasa de
   204 a 89px en escritorio y las ocho entran en dos filas.

   Las opciones heredaban 18px en gris apagado, que es el cuerpo de prosa del
   sitio y no pega con los 16px ink del resto del formulario. Se igualan. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-subgroup {
  gap: 10px 22px;
  margin-top: 4px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-option {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-option label {
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 16px;
  line-height: 1.4;
  color: var(--e-global-color-ink);
  cursor: pointer;
  margin: 0;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-option input[type="checkbox"] {
  width: 18px;
  height: 18px;
  margin: 0;
  accent-color: var(--e-global-color-accent-text);
  cursor: pointer;
}
/* el campo de archivo no es un input de texto y no hereda lo de arriba */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-type-upload input[type="file"] {
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 15px;
  color: var(--e-global-color-muted);
  width: 100%;
  padding: 14px;
  border: 1px dashed var(--e-global-color-border);
  border-radius: 4px;
  background-color: var(--e-global-color-surface);
}
/* OJO con el nombre del pseudo-elemento. El estandar para el boton del campo
   de archivo lleva adentro, literal, el token que Elementor sustituye al
   compilar el custom_css, asi que ese nombre NO puede escribirse en este
   archivo, ni siquiera dentro de un comentario: el preflight de grep lo
   rechaza y con razon. Ya paso antes, con un comentario que citaba
   CSS.supports. Se usa el alias de WebKit, que no lo contiene y cubre Chrome,
   Edge y Safari. En Firefox el boton queda con su aspecto por defecto, que es
   feo pero funciona. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-field-type-upload input[type="file"]::-webkit-file-upload-button {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 14px;
  font-weight: 600;
  color: var(--e-global-color-ink);
  background-color: var(--e-global-color-bg);
  border: 1px solid var(--e-global-color-border);
  border-radius: 3px;
  padding: 8px 14px;
  margin-right: 12px;
  cursor: pointer;
}
/* el boton: navy con texto cream, que es el par que pidio el cliente y el
   mismo del boton del header.

   La cadena lleva .elementor-widget-form aunque parezca redundante, y no lo
   es. Elementor materializa su propio default de color de texto del boton en
   el CSS POR PAGINA, como
     .elementor-67 .elementor-element.elementor-element-6934776 .elementor-button[type="submit"] { color:#ffffff }
   que es (0,5,0). La cadena de este bloque sin .elementor-widget-form tambien
   daba (0,5,0), asi que empataba y perdia por orden: post-67.css carga despues
   que post-5.css. Medido con getMatchedStylesForNode: el boton salia blanco
   puro en vez de cream. Con .elementor-widget-form la cadena pasa a (0,6,0) y
   gana. No alcanza con borrar un ajuste del widget: ese color no esta seteado,
   es el default del widget y Elementor lo emite igual. */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-widget-form .elementor-button[type="submit"] {
  font-family: var(--e-global-typography-accent-font-family), sans-serif;
  font-size: 17px;
  font-weight: 600;
  color: var(--e-global-color-bg);
  background-color: var(--e-global-color-ink);
  border: 0;
  border-radius: 4px;
  padding: 16px 34px;
  transition: background-color .18s ease;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-widget-form .elementor-button[type="submit"]:hover,
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-widget-form .elementor-button[type="submit"]:focus-visible {
  background-color: var(--e-global-color-accent-button);
  color: var(--e-global-color-bg);
}
/* el asterisco de requerido y los mensajes */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-mark-required .elementor-field-label:after {
  color: var(--e-global-color-accent-text);
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-message {
  font-family: var(--e-global-typography-text-font-family), sans-serif;
  font-size: 16px;
  line-height: 1.6;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-message.elementor-message-success {
  color: var(--e-global-color-ink);
}
@media (max-width: 767px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-mark-formband) .elementor-widget-form {
    padding: 24px 20px;
  }
}

/* ============================================================
   5Q. Tres secciones de la Home pasan a widgets nativos (2026-10-01)
   ============================================================
   Para que el cliente edite textos y fotos desde el editor visual. Las clases
   kadima-* se conservan, pero ahora viven en el WRAPPER del widget (el
   control _css_classes), no en un div propio adentro de un widget HTML. Eso
   cambia dos cosas que este bloque re-ancla, y que se midieron antes de
   escribir una regla:

   1. Los contenedores de Elementor NO emiten _css_classes: se probo creando
      uno con la clase y leyendo el HTML servido, sale sin ella. Asi que lo
      que antes era un div padre con clase (.kadima-tira, .kadima-splitband)
      ahora se reconoce por estructura, con :has() y un marcador oculto.
   2. Un widget nativo trae su propio CSS de Elementor, que un div adentro de
      un widget HTML no tenia. Dos de esas reglas ganaban y se midieron:
        .e-con.e-con > .e-con-inner > .elementor-widget  (0,4,0)  max-width 100%
        .elementor-widget-text-editor                    (0,1,0)  color y tipografia del kit
      La primera le ganaba a .kadima-prose (0,1,0) y el parrafo salia a 1200px
      en vez de 960. La segunda pintaba el parrafo en gris apagado en vez de
      ink y le daba 18px tambien en movil, donde antes heredaba 16.

   -- #1 el parrafo intro de "Our 4 Easy Steps" (Text Editor con .kadima-prose)
   La cadena de (0,5,0) existe para pasar por encima de la (0,4,0) de Elementor.
   color/font-size/line-height van a inherit para que el <p> herede exactamente
   lo mismo que heredaba el div viejo: la cadena de ancestros es la misma menos
   un nivel. */
.e-con.e-con > .e-con-inner > .elementor-widget-text-editor.kadima-prose {
  max-width: 960px;
  margin-left: auto;
  margin-right: auto;
  color: inherit;
  font-size: inherit;
  line-height: inherit;
}

/* -- #3 la tira de cuatro oficios (contenedor grid anidado + 4 Image widgets
   con .kadima-tira__cel). Copia literal de .kadima-tira, re-anclada al e-con
   que contiene las celdas. El velo va al ::after del e-con: ::before NO esta
   libre (Elementor lo usa para bordes y overlay) pero ::after se midio con
   content: none en los tres e-con de estas secciones.
   Los wrappers de widget dentro de un grid reciben de Elementor width y
   max-width; se anulan para que la celda sea la pista de la grilla. El
   fondo navy es el que asoma en los huecos de 2px entre celdas. */
.e-con.e-child:has(> .elementor-widget.kadima-tira__cel) {
  position: relative;
  isolation: isolate;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  /* Elementor le pone a todo grid repeat(2, 1fr) de filas por defecto. Con 4
     celdas en 4 columnas la segunda fila queda vacia y duplica el alto de la
     seccion (medido: 719px en vez de 359). Las filas se dejan automaticas. */
  grid-template-rows: none;
  grid-auto-rows: auto;
  gap: 2px;
  width: 100%;
  min-height: 0;
  margin: 0;
  padding: 0;
  background: var(--e-global-color-ink);
}
.e-con.e-child:has(> .elementor-widget.kadima-tira__cel)::after {
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0;
  pointer-events: none;
  background: rgba(26, 43, 74, .38);
}
.e-con.e-child > .elementor-widget.kadima-tira__cel {
  width: auto;
  max-width: none;
  margin: 0;
}
@media (max-width: 767px) {
  .e-con.e-child:has(> .elementor-widget.kadima-tira__cel) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* -- #2 "Why We Started Kadima" (marcador oculto .kadima-splitband + un
   contenedor hijo con Image .kadima-sb__media y Text Editor .kadima-sb__body)
   El marcador mantiene vivas TODAS las reglas de seccion que cuelgan de
   :has(.kadima-splitband): navy, velo, overflow, el H2 cream con filo a la
   izquierda, el view-timeline. Lo que se re-ancla aca es lo que antes
   dependia del div .kadima-splitband como ANCESTRO de la foto y del cuerpo,
   que ya no existe, mas lo que ese div aportaba como caja propia: 1248px
   centrados con 24px a los lados (4H.1) y el aire vertical (28px arriba y
   72 abajo en escritorio; 20 y 44 hasta 900px, 4I.1). Todo eso pasa al
   wrapper del Text Editor, y el tope de 800px que tenia el cuerpo pasa a
   cada <p>: mismo borde izquierdo y derecho que antes.

   POR QUE UN CONTENEDOR HIJO. La foto vieja era absoluta contra el wrapper
   del widget HTML, que es position: relative por Elementor y ocupa justo la
   banda de debajo del titulo (medido a 1440: y145, 607px de alto). Un Image
   suelto en la seccion se posiciona contra la seccion entera y la foto se
   mete detras del titulo, a otra escala (medido: 37% de pixeles distintos).
   El contenedor hijo que agrupa foto y texto ocupa la misma caja que el
   wrapper viejo y es el que recibe position: relative. No lleva z-index ni
   isolation para no crear contexto de apilamiento (4I.2).

   Medido en la primera pasada y corregido aca, con las capturas de antes
   como referencia:
   - el cuerpo salia en x=0: el .e-con-inner de la banda es de ancho completo
     (4H.1) y un wrapper con margin-right auto se pega al borde izquierdo.
   - 22px menos de alto: el ritmo entre parrafos venia de
     .kadima-prose p + p (margin-top 1.4em, 4O.5), que ya no alcanza a estos
     <p> porque .kadima-prose quedaba en el div viejo. Se repite aca; colapsa
     con los 16px de abajo igual que antes y da 23.8px a 17px de cuerpo.
   - el primer parrafo salia a 18px en movil: la regla de 640px de 4F.6 la
     pisaba el clamp de 4H.2, mas especifico, asi que el valor real era 19px.
   - los 16px de los parrafos en movil cortan a 640px, no a 767.
   Las cadenas de foto y cuerpo usan descendiente y no hijo directo, asi
   que siguen valiendo si el cliente saca un widget del contenedor hijo.
   La entrada al scroll se declara dentro del mismo par media/supports que
   usa 4S.6, para que con reduced-motion no quede nada, como en el resto.

   Orden de apilamiento, el mismo de 4I.2: foto z0 absoluta contra el
   contenedor hijo, velo z1 en el ::before de la seccion, cuerpo z2 (3 en la
   Home por la marca de agua de 4T.1). */
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner > .e-con.e-child:has(> .elementor-widget.kadima-sb__media) {
  position: relative;
  z-index: auto;
  isolation: auto;
  display: block;
  width: 100%;
  max-width: none;
  min-height: 0;
  margin: 0;
  padding: 0;
  gap: 0;
  overflow: visible;
  border: 0;
  background: transparent;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__media {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  max-width: none;
  height: 100%;
  min-height: 0;
  margin: 0;
  border: 0;
  background: transparent;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__media > img {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 1248px;
  margin: 0 auto;
  padding: 28px 24px 72px;
  border: 0;
  background: transparent;
  box-shadow: none;
  text-align: left;
  color: inherit;
  font-size: inherit;
  line-height: inherit;
}
[data-elementor-type="wp-page"] > .e-con.elementor-element-08cb80d:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body {
  z-index: 3;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body > p {
  margin: 0 0 16px;
  max-width: 800px;
  font-size: 17px;
  line-height: 1.7;
  text-align: justify;
  hyphens: auto;
  -webkit-hyphens: auto;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body > p + p {
  margin-top: 1.4em;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body > p:last-child {
  margin-bottom: 0;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body > p:first-of-type {
  font-size: clamp(19px, 1.45vw, 23px);
  line-height: 1.55;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body > p.kadima-more {
  font-size: 16px;
  text-align: left;
  hyphens: manual;
  -webkit-hyphens: manual;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body strong {
  color: var(--e-global-color-bg);
  font-weight: 700;
}
[data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body em {
  color: var(--e-global-color-bg);
  font-style: italic;
}
@media (max-width: 900px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body {
    padding: 20px 24px 44px;
  }
}
@media (max-width: 640px) {
  [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body > p {
    font-size: 16px;
  }
}
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    [data-elementor-type="wp-page"] > .e-con:has(.kadima-splitband) > .e-con-inner .elementor-widget.kadima-sb__body {
      animation: kadimaEntraLenta linear both;
      animation-timeline: --kadimaBandaTL;
      animation-range: entry 0% entry 70%;
    }
  }
}

/* -- marcador de la banda "Why We Started Kadima"
   La seccion se reconoce por :has(.kadima-splitband). Como el contenedor no
   emite clases, ese marcador vive en un widget HTML con un <span hidden>. El
   span no pinta, pero el wrapper del widget sigue siendo un .elementor-widget
   con el margen inferior de Elementor (20px) y correria el cuerpo hacia abajo.
   Se saca del flujo: :has() es estructural y lo sigue encontrando. */
.e-con-inner > .elementor-widget-html:has(> .kadima-splitband[hidden]) {
  display: none;
}/* End custom CSS */