/* Páginas institucionales: aviso de privacidad, términos y condiciones, * política de cookies, información regulatoria y política de calidad. * * Las cinco comparten una sola plantilla, `LegalDoc`, que recibe el documento * de `window.LEGAL_DATA` y lo arma. Son páginas de consulta: el diseño * prioriza encontrar un apartado y leerlo, no persuadir. * * Decisiones de diseño que conviene no deshacer sin pensarlo: * · Ancho de lectura limitado (68ch). Un texto legal a 1240 px no se lee. * · Índice lateral pegajoso en escritorio, plegable arriba en móvil. Es la * misma lista; no se duplica el contenido. * · Las tablas se vuelven fichas a 390 px: cada celda lleva su rótulo de * columna como texto. Una tabla de 7 columnas con scroll horizontal en un * teléfono no la lee nadie. * · Los avisos de «pendiente» son parte del contenido, no un adorno del * prototipo: dicen al público que ese apartado todavía no está cerrado. * · La etiqueta «Borrador sujeto a revisión jurídica» es visible y temporal. * Se retira cuando jurídico apruebe, no antes. */ const LG = () => window.LEGAL_DATA; function lglEnlaceDocumento(href, txt) { if (window.INFECTOLAB_PRODUCTION === true && href === LG().ISO_PDF) { return { href: "https://wa.me/526646985015?text=" + encodeURIComponent("Hola, quisiera solicitar el certificado ISO 9001:2015 de InfectoLab."), txt: "Solicitar certificado por WhatsApp", }; } return { href, txt }; } /* Desplazamiento a un ancla, descontando el encabezado fijo. `smooth` no * funciona en este prototipo (ver el lote ginecológico), así que `instant`. */ function lglIrA(id) { const el = document.getElementById(id); if (!el) return; const top = el.getBoundingClientRect().top + window.scrollY - 88; window.scrollTo({ top: Math.max(top, 0), behavior: "instant" }); /* El foco se mueve de verdad: con el teclado, el índice debe llevar al * apartado, no sólo mover la página. */ el.setAttribute("tabindex", "-1"); el.focus({ preventScroll: true }); } /* ───────────────────────── piezas de contenido ───────────────────────── */ function LglBloque({ b }) { if (b.t === "p") return

{b.txt}

; if (b.t === "h3") return

{b.txt}

; if (b.t === "ul") return ( ); if (b.t === "resumen") return ( ); if (b.t === "nota") return ( ); if (b.t === "dl") return (
{b.items.map((it, i) => (
{it.k}
{it.href ? {it.v} : it.v}
))}
); if (b.t === "enlace") { const enlace = lglEnlaceDocumento(b.href, b.txt); return (

{enlace.txt} {b.externo && · abre en una pestaña nueva}

); } if (b.t === "tabla") return (
{b.cols.map((c, i) => )} {b.filas.map((fila, i) => ( {b.claves.map((k, j) => ( ))}
{c}
{/* El rótulo de columna va en el DOM, no en un ::before: al * apilarse la tabla en móvil el navegador ya no asocia la * celda con su encabezado, y el texto generado por CSS no * es un sustituto fiable. En escritorio se oculta con * display:none, así que ahí manda el . */} {b.cols[j]} {fila[k]} ))}
); /* Tabla declarada pero todavía sin filas. Se muestra la estructura y el * motivo; nunca una fila de ejemplo que alguien pueda leer como un dato. */ if (b.t === "tablaVacia") { if (b.filas && b.filas.length) { return ; } return (
{b.cols.map((c, i) => {c})}

{b.vacio}

); } return null; } /* ───────────────────────── índice de anclas ───────────────────────── */ function LglIndice({ secciones, activa }) { const [abierto, setAbierto] = React.useState(false); return ( ); } /* Marca el apartado que se está leyendo. Umbral en 140 px: lo que quedó justo * debajo del encabezado fijo es lo que el lector tiene delante. */ function useSeccionActiva(ids) { const [activa, setActiva] = React.useState(ids[0]); React.useEffect(() => { const alScroll = () => { let actual = ids[0]; for (const id of ids) { const el = document.getElementById(id); if (el && el.getBoundingClientRect().top <= 140) actual = id; } setActiva(actual); }; alScroll(); window.addEventListener("scroll", alScroll, { passive: true }); return () => window.removeEventListener("scroll", alScroll); }, [ids.join("|")]); return activa; } /* ───────────────────────── plantilla común ───────────────────────── */ function LegalDoc({ doc, navigate, migas, children }) { const ids = doc.secciones.map((s) => s.id); const activa = useSeccionActiva(ids); const ruta = migas || []; return (
{doc.eyebrow}

{doc.h1}

{doc.intro}

{doc.version} Actualizado: {doc.actualizado} {/* Etiqueta temporal de prototipo. Se retira al aprobar jurídico. */} Borrador sujeto a revisión jurídica
{children}

{doc.version} · Actualizado el {doc.actualizado}.

Para cualquier duda sobre este documento escriba a{" "} {LG().CONTACTO.correo}.

); } /* Cuerpo estándar: una sección por apartado, con sus bloques. */ function LglSecciones({ doc }) { return ( <> {doc.secciones.map((s, i) => (

{s.titulo}

{s.bloques.map((b, j) => )}
))} ); } /* ───────────────────────── las cinco páginas ───────────────────────── */ function PrivacidadPage({ navigate }) { const doc = LG().PRIVACIDAD; return ; } function TerminosPage({ navigate }) { const doc = LG().TERMINOS; return ; } function CookiesPage({ navigate }) { const doc = LG().COOKIES; return ; } function InformacionRegulatoriaPage({ navigate }) { const doc = LG().REGULATORIO; return ; } /* La política de calidad no es un texto corrido: separa lo que está publicado * desde 2021 de lo que hoy tiene respaldo documental. Por eso tiene cuerpo * propio en vez de usar `LglSecciones`. */ function PoliticaDeCalidadPage({ navigate }) { const doc = LG().CALIDAD; const { historico, evidencia, lineas } = doc; return (

Nuestro compromiso

{doc.declaracion}

Líneas de trabajo

Los objetivos que InfectoLab publicó en su política de calidad guían el trabajo diario del laboratorio. Se presentan aquí como líneas de trabajo:

    {lineas.map((l, i) => (
  1. {l.titulo}

    {l.txt}

  2. ))}

Evidencia y documentación

Una línea de trabajo y una evidencia no son lo mismo. Abajo se indica, para cada una, qué documentación está disponible hoy.

El detalle del certificado, su alcance y el organismo que lo emite están en la{" "} { e.preventDefault(); navigate("calidad"); }}> página de calidad y certificación .

Política y objetivos publicados en {historico.anio}

Éste es el texto que InfectoLab publicó en {historico.anio}. Se reproduce íntegro como antecedente. Los objetivos que enuncia son metas del sistema de gestión, no resultados alcanzados.

{historico.politica}

Objetivos
    {historico.objetivos.map((o, i) =>
  • {o}
  • )}
Política de calidad InfectoLab, {historico.anio}

Consultar el documento original en PDF · abre en una pestaña nueva

Quejas y sugerencias

El seguimiento de quejas forma parte del sistema de gestión de la calidad. Si quiere presentar una queja, una sugerencia o una felicitación, escriba a{" "} {LG().CONTACTO.correo} o comuníquese al {LG().CONTACTO.telAtencion}.

); } /* ───────────────────────── estilos, con alcance .lgl ───────────────────────── */ /* OJO al editar: todo lo de abajo vive dentro de un literal de plantilla. * Un acento grave en un comentario CSS lo cierra a media hoja y Babel tumba * la página entera con un error de sintaxis. Para citar un valor, comillas. */ function LegalStyles() { return ; } Object.assign(window, { PrivacidadPage, TerminosPage, CookiesPage, InformacionRegulatoriaPage, PoliticaDeCalidadPage, LegalDoc, LglSecciones, LglBloque, LegalStyles, });