/* ============================================================================
   CUSTODE — Legal Realty S.A.S.
   01-base.css — reset, tipografia base, prosa, enlaces, foco, seleccion,
   contenedores, ritmo de banda y etiquetas en versalitas.

   NO CONTIENE COMPONENTES. La card de inmueble, la nav, el formulario y la
   ficha viven en 02-chrome / 03-inventory / 04-property / 05-pages y los
   escriben otros agentes. Aqui solo esta el sustrato del que cuelgan.

   Ningun hex y ningun px de tipografia suelto: todo sale de 00-tokens.css.
   ========================================================================= */

/* ============================================================================
   1. RESET
   ========================================================================= */

*,
*::before,
*::after { box-sizing: border-box; }

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

body,
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd,
ol, ul, fieldset, legend {
  margin: 0;
  padding: 0;
}

ol[class], ul[class] {
  list-style: none;
}

img, picture, video, canvas, svg {
  display: block;
  max-width: 100%;
}

img {
  height: auto;
  border-style: none;
}

input, button, textarea, select {
  font: inherit;
  color: inherit;
}

button {
  background: none;
  border: 0;
  cursor: pointer;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
}

hr {
  border: 0;
  border-top: var(--c-hair-w) solid var(--c-rule);
  margin: 0;
}

/* Italiana solo existe en peso 400. Un 700 sintetizado por el navegador
   destruye el contraste Didone y convierte el logotipo en otra fuente.
   Se blinda en CSS y no en un manual de entrega. */
:root {
  font-synthesis: none;
  -webkit-font-synthesis: none;
}

/* ============================================================================
   2. SUPERFICIE Y TIPOGRAFIA BASE
   El ground por defecto es PAPEL. La tinta negra es una banda reservada
   (.c-sheet--ink), no el fondo del sitio.
   ========================================================================= */

body {
  background-color: var(--c-paper);
  color: var(--c-ink-200);
  font-family: var(--c-font-prose);
  font-size: var(--c-fs-body);
  font-weight: var(--c-fw-prose);
  line-height: var(--c-lh-body);
  text-rendering: optimizeLegibility;
  -moz-osx-font-smoothing: grayscale;
}

/* NO se aplica -webkit-font-smoothing: antialiased de forma global.
   Sobre PAPEL (tinta oscura sobre fondo claro) el subpixel del sistema
   engorda ligeramente las astas y eso favorece a la Didone. El
   antialiasing en escala de grises la adelgaza. Sobre la banda de tinta
   el calculo se invierte y ahi si se aplica — ver seccion 9. */

/* ============================================================================
   3. TITULARES — la frontera dura de las familias

   Italiana vive SOLO en h1-h3 y con piso de 24px. Por debajo manda
   Plex Serif. Esa frontera es lo unico que impide que un sistema de cinco
   familias parezca un accidente, y por eso se declara aqui por nivel de
   encabezado en vez de dejarse a criterio de quien maquete.
   ========================================================================= */

h1, h2, h3 {
  font-family: var(--c-font-display);
  font-weight: var(--c-fw-display);
  color: var(--c-ink-000);
  text-wrap: balance;
}

h4, h5, h6 {
  font-family: var(--c-font-prose);
  font-weight: var(--c-fw-prose-md);
  color: var(--c-ink-000);
  text-wrap: balance;
}

h1 { font-size: var(--c-fs-d1); line-height: var(--c-lh-d1); letter-spacing: var(--c-tr-d1); }
h2 { font-size: var(--c-fs-d2); line-height: var(--c-lh-d2); letter-spacing: var(--c-tr-d2); }
h3 { font-size: var(--c-fs-d3); line-height: var(--c-lh-d3); letter-spacing: var(--c-tr-d3); }
h4 { font-size: var(--c-fs-d4); line-height: var(--c-lh-d4); }
h5 { font-size: var(--c-fs-body); line-height: var(--c-lh-d4); }
h6 { font-size: var(--c-fs-small); line-height: var(--c-lh-d4); }

/* Utilidades de display, para cuando el nivel semantico y el tamano
   optico no coinciden. */
.c-d1 { font-family: var(--c-font-display); font-weight: var(--c-fw-display); font-size: var(--c-fs-d1); line-height: var(--c-lh-d1); letter-spacing: var(--c-tr-d1); color: var(--c-ink-000); }
.c-d2 { font-family: var(--c-font-display); font-weight: var(--c-fw-display); font-size: var(--c-fs-d2); line-height: var(--c-lh-d2); letter-spacing: var(--c-tr-d2); color: var(--c-ink-000); }
.c-d3 { font-family: var(--c-font-display); font-weight: var(--c-fw-display); font-size: var(--c-fs-d3); line-height: var(--c-lh-d3); letter-spacing: var(--c-tr-d3); color: var(--c-ink-000); }
.c-d4 { font-family: var(--c-font-prose);   font-weight: var(--c-fw-prose-md); font-size: var(--c-fs-d4); line-height: var(--c-lh-d4); color: var(--c-ink-000); }

/* EL LOCKUP — Italiana en versalitas con tracking amplio. Es el tratamiento
   literal del logotipo del brandbook y por eso esta reservado a la identidad:
   wordmark y marca de seccion. Nunca un titular corriente. */
.c-lockup {
  font-family: var(--c-font-display);
  font-weight: var(--c-fw-display);
  text-transform: uppercase;
  letter-spacing: var(--c-tr-caps);
  line-height: var(--c-lh-d3);
  color: var(--c-ink-000);
  /* el tracking anade aire DESPUES del ultimo caracter y rompe toda
     alineacion a la derecha: se compensa siempre */
  margin-right: calc(-1 * var(--c-tr-caps));
}

/* ============================================================================
   4. PROSA — el cuerpo de las fichas y las paginas editoriales
   ========================================================================= */

.c-prose {
  max-width: var(--c-prose);
  color: var(--c-ink-200);
  font-family: var(--c-font-prose);
  font-size: var(--c-fs-body);
  line-height: var(--c-lh-body);
}

.c-prose > * + * { margin-top: var(--c-sp-5); }

.c-prose > * + h2,
.c-prose > * + h3,
.c-prose > * + h4 { margin-top: var(--c-sp-8); }

.c-prose h2,
.c-prose h3,
.c-prose h4 { margin-bottom: calc(-1 * var(--c-sp-2)); }

.c-prose strong,
.c-prose b {
  font-weight: var(--c-fw-prose-md);
  color: var(--c-ink-000);
}

/* La cursiva queda reservada al termino juridico destacado. Es el unico
   enfasis cromatico que la prosa se permite. */
.c-prose em,
.c-prose i {
  font-style: italic;
  color: var(--c-brass-text);
}

.c-prose ul,
.c-prose ol {
  padding-left: var(--c-sp-5);
}

.c-prose li + li { margin-top: var(--c-sp-3); }

.c-prose ul { list-style: none; padding-left: 0; }

.c-prose ul > li {
  position: relative;
  padding-left: var(--c-sp-5);
}

/* Vinieta de filete, no un bullet redondo: la lista se lee como un
   articulado y no como una lista de features. */
.c-prose ul > li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.72em;
  width: var(--c-sp-3);
  height: var(--c-hair-w);
  background-color: var(--c-brass);
}

.c-prose ol {
  list-style: none;
  counter-reset: c-item;
  padding-left: 0;
}

.c-prose ol > li {
  position: relative;
  counter-increment: c-item;
  padding-left: var(--c-sp-7);
}

.c-prose ol > li::before {
  content: counter(c-item, decimal-leading-zero);
  position: absolute;
  left: 0;
  top: 0.25em;
  font-family: var(--c-font-data);
  font-size: var(--c-fs-fine);
  font-weight: var(--c-fw-data-md);
  font-variant-numeric: tabular-nums lining-nums;
  letter-spacing: var(--c-tr-data);
  color: var(--c-brass-text);
}

.c-prose blockquote {
  border-left: var(--c-hair-w) solid var(--c-brass);
  padding-left: var(--c-sp-5);
  font-size: var(--c-fs-lead);
  line-height: var(--c-lh-lead);
  color: var(--c-ink-100);
}

.c-prose figcaption,
.c-prose small {
  display: block;
  font-family: var(--c-font-label);
  font-size: var(--c-fs-l3);
  font-weight: var(--c-fw-label);
  line-height: var(--c-lh-label);
  letter-spacing: var(--c-tr-l3);
  text-transform: uppercase;
  color: var(--c-ink-300);
  margin-right: calc(-1 * var(--c-tr-l3));
}

/* Entradilla */
.c-lead {
  font-family: var(--c-font-prose);
  font-size: var(--c-fs-lead);
  line-height: var(--c-lh-lead);
  color: var(--c-ink-100);
  max-width: var(--c-prose);
}

.c-fine {
  font-family: var(--c-font-prose);
  font-size: var(--c-fs-fine);
  line-height: var(--c-lh-small);
  color: var(--c-ink-400);
}

/* ============================================================================
   5. CIFRAS — dos roles, cerrado por el cliente

   Bodoni Moda para cifra DISPLAY (precios). IBM Plex Sans para DATO
   (m2, alcobas, banos, estrato, piso, ano, filtros, tablas).
   IBM Plex Mono NUNCA lleva digitos: su cero lleva un punto dentro y en
   un precio de mil millones se lee como un error.
   ========================================================================= */

.c-figure {
  font-family: var(--c-font-figure);
  font-weight: var(--c-fw-figure);
  font-variant-numeric: tabular-nums lining-nums;
  font-feature-settings: "tnum" 1, "lnum" 1;
  line-height: var(--c-lh-figure);
  color: var(--c-ink-000);
}

.c-figure--n1 { font-size: var(--c-fs-n1); }
.c-figure--n2 { font-size: var(--c-fs-n2); }
.c-figure--n3 { font-size: var(--c-fs-n3); }

/* La moneda va siempre COP y nunca "COL$", que es un artefacto del portal
   Wasi y no una moneda colombiana. Se compone un paso mas apagada y en
   Plex Sans para que el numero mande. */
.c-figure__cur {
  font-family: var(--c-font-data);
  font-size: var(--c-fs-fine);
  font-weight: var(--c-fw-data);
  letter-spacing: var(--c-tr-l2);
  color: var(--c-ink-400);
  margin-right: var(--c-sp-2);
}

.c-data {
  font-family: var(--c-font-data);
  font-weight: var(--c-fw-data);
  font-size: var(--c-fs-data);
  line-height: var(--c-lh-data);
  font-variant-numeric: tabular-nums lining-nums;
  font-feature-settings: "tnum" 1, "lnum" 1;
  letter-spacing: var(--c-tr-data);
  color: var(--c-ink-100);
}

.c-data--sm { font-size: var(--c-fs-data-sm); }

/* ============================================================================
   6. ETIQUETAS EN VERSALITAS — IBM Plex Mono, tracking extremo

   La monoespaciada, y no un sans tracked, es lo que produce la sensacion
   de expediente y escritura publica. Es el uso que le da el brandbook.
   Toda etiqueta <=12px va aqui, en caja alta, sin excepcion.
   Todas compensan el tracking con margin-right negativo.
   ========================================================================= */

.c-label {
  font-family: var(--c-font-label);
  font-weight: var(--c-fw-label);
  font-size: var(--c-fs-l1);
  line-height: var(--c-lh-label);
  letter-spacing: var(--c-tr-l1);
  text-transform: uppercase;
  color: var(--c-ink-300);
  margin-right: calc(-1 * var(--c-tr-l1));
}

.c-label--l2 {
  font-size: var(--c-fs-l2);
  letter-spacing: var(--c-tr-l2);
  margin-right: calc(-1 * var(--c-tr-l2));
}

.c-label--l3 {
  font-size: var(--c-fs-l3);
  letter-spacing: var(--c-tr-l3);
  margin-right: calc(-1 * var(--c-tr-l3));
}

/* Latón como texto sobre papel: DOS valores, no uno.
   La WCAG mide el color pero el ojo mide el grosor del trazo.
   --brass-text para trazo solido (Plex, 5.01:1).
   --brass-hair para trazo fino (Italiana / Bodoni, 6.03:1): una Didone
   a 5:1 se lee visiblemente mas debil que una Plex al mismo ratio. */
.c-label--brass { color: var(--c-brass-text); }
.c-label--muted { color: var(--c-ink-400); }

/* La cejilla de seccion: etiqueta precedida del filete que se traza.
   El filete es el gesto de motion de la marca; su estado de reposo esta
   DECLARADO (scaleX(1)) y solo se oculta cuando el JS confirma que puede
   animarlo — ver seccion 11. */
.c-eyebrow {
  display: flex;
  align-items: center;
  gap: var(--c-sp-4);
  font-family: var(--c-font-label);
  font-weight: var(--c-fw-label);
  font-size: var(--c-fs-l1);
  line-height: var(--c-lh-label);
  letter-spacing: var(--c-tr-l1);
  text-transform: uppercase;
  color: var(--c-brass-text);
}

.c-eyebrow::before {
  content: "";
  flex: 0 0 auto;
  width: var(--c-sp-7);
  height: var(--c-hair-w);
  background-color: var(--c-brass);
  transform: scaleX(1);
  transform-origin: 0 50%;
  transition: transform var(--c-dur-rule) var(--c-ease-rule);
}

/* ============================================================================
   7. FILETES — la gramatica, tres pesos con significado asignado

   Se diferencian por ALFA y no por grosor: 0.5px se renderiza mal en
   pantallas 1x y 1px al 14% se renderiza bien en todas.
     .c-hair  separa CAMPOS dentro de un bloque
     .c-rule  separa BLOQUES dentro de una seccion
     .c-close CIERRA un documento
   ========================================================================= */

.c-hair  { border: 0; border-top: var(--c-hair-w) solid var(--c-hair); }
.c-rule  { border: 0; border-top: var(--c-hair-w) solid var(--c-rule); }

/* Filete doble: linea gruesa + aire + linea fina. Es el unico gesto que
   declara "aqui termina el documento". No se usa como separador. */
.c-close {
  border: 0;
  border-top: var(--c-hair-w) solid var(--c-close);
  border-bottom: var(--c-hair-w) solid var(--c-hair);
  height: var(--c-close-gap);
}

.c-hair--brass { border-top-color: var(--c-brass-a42); }
.c-rule--brass { border-top-color: var(--c-brass-a85); }

/* ============================================================================
   8. ENLACES

   El subrayado es un filete que se traza de izquierda a derecha, no un
   text-decoration que aparece de golpe. El enlace en prosa nace subrayado
   (nunca se distingue un enlace solo por color) y el filete cambia de peso
   en hover.
   ========================================================================= */

a {
  color: inherit;
  text-decoration: none;
}

.c-prose a,
.c-link {
  color: var(--c-ink-000);
  background-image: linear-gradient(to right, var(--c-brass), var(--c-brass));
  background-repeat: no-repeat;
  background-size: 100% var(--c-hair-w);
  background-position: 0 100%;
  padding-bottom: 0.12em;
  transition: background-size var(--c-dur-hover) var(--c-ease-rule),
              color var(--c-dur-tick) var(--c-ease-ink);
}

@media (hover: hover) and (pointer: fine) {
  .c-prose a:hover,
  .c-link:hover {
    color: var(--c-brass-text);
    background-size: 100% calc(var(--c-hair-w) * 2);
  }
}

.c-prose a:active,
.c-link:active { color: var(--c-brass-hair); }

/* Enlace de navegacion: el filete nace en cero y se traza en hover. */
.c-link--nav {
  background-size: 0 var(--c-hair-w);
  padding-bottom: 0.35em;
}

@media (hover: hover) and (pointer: fine) {
  .c-link--nav:hover { background-size: 100% var(--c-hair-w); }
}

.c-link--nav[aria-current],
.c-link--nav.is-active { background-size: 100% var(--c-hair-w); }

/* ============================================================================
   9. LA BANDA DE TINTA — el mecanismo de inversion

   UNA sola clase intercambia TODOS los roles semanticos de golpe. Ninguna
   regla individual se toca nunca para invertir un bloque: si manana el
   cliente pide otra banda oscura, se le pone esta clase y el sistema entero
   ya esta resuelto y ya esta verificado en contraste.

   Regla heredada de Serhant y no negociable: LA BANDA OSCURA SIEMPRE
   CARGA FOTOGRAFIA. Nunca se usa para una seccion de solo texto.
   ========================================================================= */

.c-sheet--ink {
  background-color: var(--c-ink-band);
  color: var(--c-inv-200);

  /* roles de texto */
  --c-ink-000: var(--c-inv-000);
  --c-ink-100: var(--c-inv-100);
  --c-ink-200: var(--c-inv-200);
  --c-ink-300: var(--c-inv-300);
  --c-ink-400: var(--c-inv-400);
  --c-ink-500: var(--c-inv-500);

  /* sobre tinta el laton SI puede ser texto: 6.60:1 */
  --c-brass-text: var(--c-brass);
  --c-brass-hair: var(--c-brass-hi);

  /* filetes invertidos */
  --c-hair:  var(--c-hair-inv);
  --c-rule:  var(--c-rule-inv);
  --c-close: var(--c-close-inv);

  --c-focus-color: var(--c-focus-color-inv);

  /* sobre fondo oscuro el subpixel engorda las astas y una Didone de alto
     contraste ya sufre halacion: aqui SI se pide escala de grises */
  -webkit-font-smoothing: antialiased;
}

/* Bandas de papel alternas */
.c-sheet--paper-2 { background-color: var(--c-paper-2); }
.c-sheet--paper-3 { background-color: var(--c-paper-3); }

/* ============================================================================
   10. CONTENEDORES Y RITMO

   Ningun padding vertical de seccion se escribe a mano. Se usa .c-band--N.
   N=0 es deliberado: dos bandas contiguas en N=0 se leen como un solo
   bloque continuo, que es lo que hace que la pagina no parezca una lista
   de secciones.
   ========================================================================= */

.c-shell {
  width: 100%;
  max-width: calc(var(--c-shell) + var(--c-gutter) * 2);
  margin-inline: auto;
  padding-inline: var(--c-gutter);
}

/* Colgado asimetrico: papel membretado, no marca-media centrada.
   Es un offset POR SECCION y no una columna de grilla a nivel de pagina,
   que es lo unico que sobrevive al modelo de contenedores de Elementor. */
.c-shell--hang > * { margin-left: var(--c-hang); }

.c-band--0 { padding-block: var(--c-band-0); }
.c-band--1 { padding-block: var(--c-band-1); }
.c-band--2 { padding-block: var(--c-band-2); }
.c-band--3 { padding-block: var(--c-band-3); }
.c-band--4 { padding-block: var(--c-band-4); }
.c-band--xl { padding-block: var(--c-band-xl); }

.c-band--top-0    { padding-top: var(--c-band-0); }
.c-band--bottom-0 { padding-bottom: var(--c-band-0); }

.c-measure { max-width: var(--c-prose); }

.c-split {
  display: grid;
  grid-template-columns: minmax(0, var(--c-split-main)) minmax(0, var(--c-split-aside));
  gap: var(--c-split-gap);
  align-items: start;
}

.c-grid-3 {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--c-grid-gap);
}

@media (max-width: 1023px) {
  .c-split   { grid-template-columns: minmax(0, 1fr); }
  .c-grid-3  { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 767px) {
  .c-grid-3  { grid-template-columns: minmax(0, 1fr); gap: var(--c-sp-8); }
  .c-shell--hang > * { margin-left: 0; }
}

/* ============================================================================
   11. FOCO ACCESIBLE

   Nunca outline:none sin sustituto. El anillo aparece SOLO con
   :focus-visible, asi que el raton no lo dispara y el teclado siempre lo ve.
   ========================================================================= */

:focus { outline: none; }

:focus-visible {
  outline: var(--c-focus-w) solid var(--c-focus-color);
  outline-offset: var(--c-focus-offset);
}

/* Sobre fotografia el anillo necesita un contra-halo para no perderse
   contra un cielo quemado. */
.c-on-media :focus-visible {
  outline-color: var(--c-brass-hi);
  box-shadow: 0 0 0 calc(var(--c-focus-w) + var(--c-focus-offset)) var(--c-veil-86);
}

/* Salto al contenido: existe siempre, visible solo al enfocar. */
.c-skip {
  position: absolute;
  left: var(--c-sp-4);
  top: var(--c-sp-4);
  z-index: var(--c-z-modal);
  transform: translateY(-200%);
  background-color: var(--c-ink);
  color: var(--c-inv-000);
  padding: var(--c-sp-3) var(--c-sp-5);
  font-family: var(--c-font-label);
  font-size: var(--c-fs-l2);
  font-weight: var(--c-fw-label);
  letter-spacing: var(--c-tr-l2);
  text-transform: uppercase;
  transition: transform var(--c-dur-hover) var(--c-ease-plate);
}

.c-skip:focus-visible { transform: translateY(0); }

/* ============================================================================
   12. SELECCION
   ========================================================================= */

::selection {
  background-color: var(--c-brass-a24);
  color: var(--c-ink-000);
}

.c-sheet--ink ::selection {
  background-color: var(--c-brass-a42);
  color: var(--c-inv-000);
}

/* ============================================================================
   13. ENTRADA AL VIEWPORT — mejora progresiva real

   Las tres leyes que esto obedece se pagaron con una home entera sin
   titulares en un prototipo previo:

   1. El estado de REPOSO se declara y nunca lo produce solo una animacion.
      Sin la clase .js en <html>, todo esta visible. Si el JS falla, no
      carga, o un error de terceros lo detiene antes de tiempo, la pagina
      se lee completa.
   2. Se usa transform + opacity dentro de overflow:hidden. JAMAS un
      clip-path conmutado por clase: el motor no compone esa transicion,
      la clase queda correctamente aplicada en el DOM, no hay ningun error
      en consola y el texto simplemente no aparece.
   3. La clase .js se pone INLINE en el <head>, y el JS mantiene una red
      de seguridad que revela todo a los 2600ms pase lo que pase.
   ========================================================================= */

/* Sin la clase .js NO existe ninguna regla que oculte .c-reveal: el elemento
   se pinta con su opacidad por defecto. Por eso aqui NO hay ninguna regla
   suelta `.c-reveal { opacity: 1 }` — meterla en una lista de selectores
   junto a `.js .c-reveal.is-in` hace que el motor tome la especificidad del
   selector mas alto de la lista y el estado de reposo deja de aplicarse.
   Verificado en Chrome: la regla ganaba y la entrada no ocurria nunca. */
.js .c-reveal {
  opacity: 0;
  transform: translate3d(0, var(--c-enter-y), 0);
  transition: opacity var(--c-dur-enter) var(--c-ease-ink),
              transform var(--c-dur-enter) var(--c-ease-plate);
  transition-delay: var(--c-reveal-delay, 0ms);
}

.js .c-reveal.is-in {
  opacity: 1;
  transform: none;
}

.js .c-eyebrow.c-reveal::before { transform: scaleX(0); }
.js .c-eyebrow.c-reveal.is-in::before { transform: scaleX(1); }

/* ============================================================================
   14. MOVIMIENTO REDUCIDO

   Las duraciones ya cayeron a 1ms en 00-tokens.css. Lo que importa aqui es
   que el ESTADO FINAL quede RENDERIZADO: un usuario con movimiento reducido
   debe ver la misma pagina, no una pagina incompleta con los filetes sin
   dibujar. Por eso los filetes se fuerzan a scaleX(1) y no a invisibles.
   ========================================================================= */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }

  .js .c-reveal,
  .js .c-reveal.is-in {
    opacity: 1 !important;
    transform: none !important;
  }

  .js .c-eyebrow.c-reveal::before,
  .js .c-eyebrow.c-reveal.is-in::before,
  .c-eyebrow::before {
    transform: scaleX(1) !important;
  }

  *,
  *::before,
  *::after {
    animation-duration: 1ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 1ms !important;
  }
}

/* ============================================================================
   15. UTILIDADES MINIMAS
   ========================================================================= */

.c-vh {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.c-hang  { margin-left: var(--c-hang); }
.c-stack > * + * { margin-top: var(--c-sp-5); }

/* Nunca se imprime una etiqueta sin valor. Se usa como red de seguridad
   en el template: locality viene vacio en 12 de 20 registros y una tabla
   reglada con campos vacios se derrumba. La regla real vive en el helper
   PHP; esto es el cinturon de seguridad. */
.c-field:not(:has(.c-field__v:not(:empty))) { display: none; }

/* Reset defensivo contra Elementor y MyHome: el sistema no tiene radios
   ni sombras de elevacion, y un widget del padre puede reintroducirlos
   en la primera edicion del cliente. */
.c-scope :where(.elementor-widget-container, .elementor-element) {
  box-shadow: none;
  border-radius: var(--c-radius);
}
