/*
Theme Name: Divi Child
Theme URI: http://www.elegantthemes.com/gallery/divi/
Template: Divi
Author: Elegant Themes
Author URI: http://www.elegantthemes.com
Description: Smart. Flexible. Beautiful. Divi is the most powerful theme in our collection.
Version: 5.13.1789654251
Updated: 2026-09-17 16:10:51

*/


/* ===== RUIDO ANIMADO FOOTER ===== */

.norval-noise {
  position: relative;
  overflow: hidden;      /* la capa es más grande que el footer */
  isolation: isolate;    /* crea stacking context: el ::before con z-index:-1 queda
                            ENCIMA del fondo de la sección y DEBAJO del contenido */
  --noise-opacity: .2;   /* ajusta la intensidad aquí */
  --noise-shift: 128px;  /* margen extra para que el desplazamiento no deje huecos */
}

.norval-noise::before {
  content: "";
  position: absolute;
  inset: calc(var(--noise-shift) * -1);
  z-index: -1;
  pointer-events: none;
  opacity: var(--noise-opacity);
  /* OPTIMIZACIÓN: SVG URL-encoded en vez de base64 → ~30% menos bytes y 0 peticiones HTTP.
     Color de los puntos: flood-color (%23 = #). Para footer oscuro usa %23FFFFFF. */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='1' seed='8000'/%3E%3CfeComponentTransfer result='a'%3E%3CfeFuncA type='discrete' tableValues='0 1'/%3E%3C/feComponentTransfer%3E%3CfeFlood flood-color='%230C1814' result='b'/%3E%3CfeComposite operator='in' in='b' in2='a'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 512px 512px;
  background-repeat: repeat;
  /* OPTIMIZACIÓN: se anima transform (compositor/GPU), NO background-position (repaint) */
  will-change: transform;
  animation: norval-noise 1s steps(5,end) infinite;
}

/* 5 posiciones discretas: steps(1) mantiene cada una 0,6 s y salta de golpe (grano de film) */
@keyframes norval-noise {
  0%   { transform: translate3d(0, 0, 0); }
  20%  { transform: translate3d(-64px, 32px, 0); }
  40%  { transform: translate3d(48px, -96px, 0); }
  60%  { transform: translate3d(-112px, -48px, 0); }
  80%  { transform: translate3d(96px, 112px, 0); }
  100% { transform: translate3d(0, 0, 0); }
}

/* Accesibilidad + ahorro de CPU: sin animación si el usuario la ha desactivado */
@media (prefers-reduced-motion: reduce) {
  .norval-noise::before { animation: none; will-change: auto; }
}



/* FIX: Divi serializa el campo de fondo de esta sección del Footer global
   como "initial" en el breakpoint móvil (≤767px), pese a estar editado en el builder.
   Se fuerza aquí para no depender de ese guardado. */
@media only screen and (max-width: 767px) {
  .et-l--footer > .et_builder_inner_content .et_pb_section.et_section_regular.norval-noise {
    /* OPTIMIZACIÓN: misma cantidad de clases que el selector de Divi + !important,
       así gana siempre, aunque Divi regenere el CSS estático después. */
    background-color: #00004c !important;
  }
}


/*************************/
/* MARQUEE LOGOS EMPRESA */
/*************************/
.nv-logos {
	padding: 40px 16px; /* = py-section-half + p-x de cofactr */
	position: relative;
}

.nv-logos__viewport {
	overflow: hidden;
	/* = mask-[linear-gradient(to_right,transparent_0%,black_15%,black_85%,transparent_100%)] */
	-webkit-mask-image: linear-gradient(to right, transparent 0%, #000 15%, #000 85%, transparent 100%);
	        mask-image: linear-gradient(to right, transparent 0%, #000 15%, #000 85%, transparent 100%);
}

.nv-logos__track {
	display: flex;
	width: max-content;
	/* OPTIMIZACIÓN: solo transform → se anima en la GPU (compositor), sin reflow */
	animation: nv-marquee var(--nv-duration, 100s) linear infinite;
	will-change: transform;
}

.nv-logos__group {
	display: flex;
	align-items: center;
	flex-shrink: 0;
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Espaciado con padding (no con gap) para que cada grupo mida exactamente el 50 % → bucle sin salto */
.nv-logos__item {
	padding: 0 clamp(20px, 3vw, 40px);
	flex-shrink: 0;
	list-style: none;
}

.nv-logos__img {
	display: block;
	height: var(--nv-h, 48px);
	width: auto;
	max-width: 180px;
	object-fit: contain;
}

.nv-logos:hover .nv-logos__track {
	animation-play-state: paused;
}

@keyframes nv-marquee {
	to { transform: translate3d(-50%, 0, 0); }
}

@media (max-width: 767px) {
	.nv-logos__img { height: calc(var(--nv-h, 48px) * 0.75); max-width: 120px; }
}

/* Accesibilidad: sin movimiento → fila con scroll horizontal */
@media (prefers-reduced-motion: reduce) {
	.nv-logos__track { animation: none; }
	.nv-logos__viewport { overflow-x: auto; }
	.nv-logos__group[aria-hidden="true"] { display: none; }
}

/* ===== Norval · Marquee de logos MASCARA ===== */
.nv-logos {
	padding: 40px 16px;
	position: relative;
}

.nv-logos__viewport {
	overflow: hidden;
	/* Igual que cofactr: fundido del 0 al 15 % y del 85 al 100 % */
	-webkit-mask-image: linear-gradient(90deg, #0000 0%, #000 15% 85%, #0000 100%); /* Safari < 15.4 */
	        mask-image: linear-gradient(90deg, #0000 0%, #000 15% 85%, #0000 100%);
}

.nv-logos__track {
	display: flex;
	width: max-content;
	animation: nv-marquee var(--nv-duration, 100s) linear infinite;
	will-change: transform; /* OPTIMIZACIÓN: se anima en la GPU, sin reflow */
}

.nv-logos__group {
	display: flex;
	align-items: center;
	flex-shrink: 0;
	margin: 0;
	padding: 0;
	list-style: none;
}

.nv-logos__item {
	padding: 0 clamp(20px, 3vw, 40px); /* padding y no gap: así el bucle no da saltos */
	flex-shrink: 0;
	list-style: none;
}

.nv-logos__img {
	display: block;
	height: var(--nv-h, 48px);
	width: auto;
	max-width: 180px;
	object-fit: contain;
}

.nv-logos:hover .nv-logos__track { animation-play-state: paused; }

/* OPTIMIZACIÓN: el módulo deja de crecer hasta el ancho del contenido (min-width:auto de flexbox) */
.nv-logos-wrap {
	width: 100%;
	max-width: 100%;
	min-width: 0;
	flex: 1 1 100%;
}

@keyframes nv-marquee { to { transform: translate3d(-50%, 0, 0); } }

@media (max-width: 767px) {
	.nv-logos__img { height: calc(var(--nv-h, 48px) * .75); max-width: 120px; }
}

@media (prefers-reduced-motion: reduce) {
	.nv-logos__track { animation: none; }
	.nv-logos__viewport { overflow-x: auto; }
	.nv-logos__group[aria-hidden="true"] { display: none; }
}

.nv-logos__img {
  filter: grayscale(1);
  transition: filter 0.3s ease;
/* OPTIMIZACIÓN: transición suave solo en filter, propiedad compositada (GPU), no fuerza layout/paint del resto del DOM */
}

.nv-logos__img:hover {
  filter: grayscale(0);
}