feat: sitio comercial FSPM con micro CRM interno
Sitio público orientado a venta consultiva e implementación de las recomendaciones de la auditoría de marca y mercado: - Inicio con tres rutas (industria, riesgo, cumplimiento) y clasificador de riesgo en el héroe, contra el hallazgo de que el visitante tenía que inferir qué solución le correspondía. - Cinco páginas por segmento prioritario y catálogo comparable por clase de fuego, capacidad y agente. - Los claims sin evidencia por modelo quedan aislados y se presentan como compromiso de documentación, nunca como característica del producto. - SEO técnico completo: metadatos por página, sitemap derivado de los datos, JSON-LD, iconos y tarjeta social generadas. Micro CRM: - Captura por formulario embebido y por widget de WhatsApp que registra antes de abrir la conversación. - Atribución de primer toque que sobrevive a la navegación. - Deduplicación de contacto; un mismo contacto acumula oportunidades. - Motor de asignación por reglas con reparto por turno de respaldo. - Panel con dos roles de alcance distinto, tablero analítico, bitácora, pedidos y reglas. No enlazado desde el sitio público y con noindex. Empaquetado en Docker multietapa con la base de demostración horneada en la imagen y el volumen de datos separado, para que los leads capturados sobrevivan a los redespliegues. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
122e06a4bb
commit
01b817d098
@@ -0,0 +1,425 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import { Revelar } from "@/components/site/Revelar";
|
||||
import { EMPRESA, NORMAS, SITIO_URL } from "@/data/empresa";
|
||||
|
||||
/**
|
||||
* /preguntas-frecuentes
|
||||
*
|
||||
* Las preguntas vienen de la página real de FSPM. Las respuestas no se copian:
|
||||
* donde la fuente afirma "no caduca", "20 años de garantía" o "no requiere
|
||||
* recarga", la respuesta explica qué documento respalda eso y bajo qué
|
||||
* condiciones. Es el mismo criterio del resto del sitio.
|
||||
*
|
||||
* El JSON-LD FAQPage se construye desde el mismo arreglo que se renderiza, así
|
||||
* que no puede desincronizarse del contenido visible.
|
||||
*/
|
||||
|
||||
const TITULO = "Preguntas frecuentes";
|
||||
const DESCRIPCION =
|
||||
"Respuestas verificables sobre FireAde 2000, vida útil, garantía, recarga, clases de fuego, certificaciones y documentación. Qué documento respalda cada afirmación y bajo qué condiciones.";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: TITULO,
|
||||
description: DESCRIPCION,
|
||||
alternates: { canonical: `${SITIO_URL}/preguntas-frecuentes` },
|
||||
openGraph: {
|
||||
title: `${TITULO} | ${EMPRESA.nombreCorto}`,
|
||||
description: DESCRIPCION,
|
||||
url: `${SITIO_URL}/preguntas-frecuentes`,
|
||||
},
|
||||
};
|
||||
|
||||
type Pregunta = {
|
||||
id: string;
|
||||
pregunta: string;
|
||||
/** Párrafos en texto plano: alimentan la página y el JSON-LD. */
|
||||
respuesta: string[];
|
||||
};
|
||||
|
||||
type Grupo = {
|
||||
id: string;
|
||||
titulo: string;
|
||||
descripcion: string;
|
||||
preguntas: Pregunta[];
|
||||
};
|
||||
|
||||
const GRUPOS: Grupo[] = [
|
||||
{
|
||||
id: "vida-util",
|
||||
titulo: "Vida útil, garantía y recarga",
|
||||
descripcion:
|
||||
"Las tres afirmaciones que el estudio de marca señaló como el mayor riesgo comercial del sitio anterior. Aquí no se repiten: se explican.",
|
||||
preguntas: [
|
||||
{
|
||||
id: "caduca",
|
||||
pregunta: "¿Es cierto que el equipo no caduca?",
|
||||
respuesta: [
|
||||
"La información pública de FSPM afirma que FireAde 2000 tiene vida de anaquel ilimitada y que conserva sus propiedades incluso mezclado con agua. No repetimos esa afirmación como característica del producto porque una vida útil se demuestra con un documento, no con una frase.",
|
||||
"Lo que respalda una respuesta seria es la carta técnica del fabricante referida al número de modelo, con las condiciones de almacenamiento y las circunstancias que la invalidan. Eso lo entregamos antes de cotizar.",
|
||||
"Además, conviene separar dos cosas que suelen mezclarse: la vida útil del agente y el mantenimiento del equipo que lo contiene. Aunque el agente conservara sus propiedades, el recipiente, la válvula y el manómetro siguen sujetos a revisión.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "recarga",
|
||||
pregunta: "¿Entonces no requiere recarga?",
|
||||
respuesta: [
|
||||
"La fuente lo presenta así, pero no especifica si aplica al agente, al extintor completo, ni bajo qué condiciones de mantenimiento. Esa distinción es justamente la que decide si tu expediente aguanta una verificación.",
|
||||
"Nuestra respuesta es documental: confirmamos por escrito a qué se refiere exactamente la ausencia de recarga en tu modelo y qué obligaciones de mantenimiento subsisten.",
|
||||
"En todo caso, la revisión periódica del equipo no desaparece. La NOM-154-SCFI-2005, referida por la NOM-002, establece que la revisión de los extintores debe hacerse cada mes.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "garantia",
|
||||
pregunta: "¿La garantía es de 20 años o de 15?",
|
||||
respuesta: [
|
||||
"Las dos cifras aparecen en la información pública de FSPM: las páginas de producto mencionan veinte años y la sección de preguntas frecuentes menciona quince para los dispositivos de aplicación. Esa inconsistencia es la razón por la que no publicamos ninguna de las dos como dato.",
|
||||
"Lo que sí entregamos es el documento de garantía del modelo, con plazo, cobertura, exclusiones y las obligaciones de mantenimiento que la conservan vigente. Un plazo sin condiciones es una cifra publicitaria, no una garantía.",
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "agente",
|
||||
titulo: "El agente FireAde 2000",
|
||||
descripcion:
|
||||
"Qué es, qué clases cubre y qué afirmaciones ambientales requieren documento antes de poder repetirse.",
|
||||
preguntas: [
|
||||
{
|
||||
id: "afff",
|
||||
pregunta: "¿FireAde 2000 es un espumógeno AFFF?",
|
||||
respuesta: [
|
||||
"La fuente responde \"sí y no\": lo describe como clasificado en la familia AFFF y, al mismo tiempo, como una evolución tecnológica frente al AFFF tradicional basado en flúor. En el catálogo aparece como FireAde 2000 AR-AFFF, con una solución al 6% para los equipos Enforcer.",
|
||||
"Para una decisión de compra la categoría importa menos que la formulación concreta. Lo que resuelve la pregunta es la ficha técnica de la variante que se te ofrece y su hoja de datos de seguridad vigente, con la composición declarada.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "clases",
|
||||
pregunta: "¿Sirve para las cinco clases de fuego, A, B, C, D y K?",
|
||||
respuesta: [
|
||||
"La fuente lo afirma de forma general, pero ella misma pone una condición: para fuegos de clase C la eficacia se declara con agua desmineralizada. Cuando una afirmación trae condición, la condición es parte de la afirmación.",
|
||||
"En cada ficha de producto mostramos el riel de clases con lo que la fuente declara, no con lo que convendría declarar, y anotamos que las condiciones por clase se confirman en la ficha técnica del modelo: concentración, equipo y tipo de agua.",
|
||||
"Hay productos del catálogo a los que deliberadamente no les atribuimos clases de fuego, como TrakAde y VaporAde Plus, porque la fuente no los presenta como agentes de extinción.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "ambiental",
|
||||
pregunta: "¿Es cierto que no es tóxico ni contaminante?",
|
||||
respuesta: [
|
||||
"La fuente afirma que no contiene materiales tóxicos, que no es contaminante, que superó pruebas con organismos acuáticos y que su biodegradabilidad es prácticamente total en veinticinco días. Son afirmaciones fuertes y verificables, y precisamente por eso pedimos verlas antes de repetirlas.",
|
||||
"Lo que las sostiene es la hoja de datos de seguridad vigente y los reportes de laboratorio con método, alcance y fecha, referidos a la formulación exacta. Un resultado obtenido sobre una variante no se traslada automáticamente a otra.",
|
||||
"Lo que no vamos a hacer es prometer que una formulación seguirá conforme a la regulación ambiental futura. Nadie puede sostener eso, y el estudio de marca lo señala como un riesgo reputacional.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "enfriamiento",
|
||||
pregunta: "¿Se puede aplicar de forma preventiva para enfriar equipo que no está ardiendo?",
|
||||
respuesta: [
|
||||
"La fuente describe ese uso, por ejemplo en transformadores y en maquinaria con carga térmica de riesgo, y menciona también instalaciones para las que no existe documentación en la extracción pública que revisamos.",
|
||||
"Por eso limitamos la respuesta a lo que puede sostenerse: la aplicación preventiva de enfriamiento se evalúa caso por caso, con la ficha técnica del agente y con el criterio del responsable del equipo que se va a rociar. No la ofrecemos como una capacidad general.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "compatibilidad",
|
||||
pregunta: "¿Es compatible con mi equipo instalado y con agua salada?",
|
||||
respuesta: [
|
||||
"La fuente afirma compatibilidad con cualquier equipamiento, incluidos sistemas de espuma de aire comprimido, y con todo tipo de aguas.",
|
||||
"En la práctica, la pregunta que hay que responder es más estrecha: si es compatible con tu equipo, del fabricante que sea, en la concentración que tu sistema dosifica. Eso se confirma cruzando la ficha técnica del agente con el manual de tu equipo, y es parte del trabajo previo a una propuesta.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "mezcla",
|
||||
pregunta: "¿Puedo mezclarlo con el espumógeno que ya tengo?",
|
||||
respuesta: [
|
||||
"No. La propia fuente lo desaconseja, y sin un dato de compatibilidad documentado la mezcla compromete el desempeño y muy probablemente la garantía.",
|
||||
"Si tienes concentrado de otra marca en el tanque, lo correcto es planear la sustitución y el manejo del residuo, no la mezcla. La disposición del concentrado que sale es un tema técnico y de costo que conviene resolver antes de la compra, no después.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "limpieza",
|
||||
pregunta: "¿Qué implica la limpieza después de usarlo?",
|
||||
respuesta: [
|
||||
"La fuente indica que el agente no es corrosivo, que su pH es prácticamente neutro y que la limpieza se resuelve con agua.",
|
||||
"El documento que respalda eso es la hoja de datos de seguridad, y es también el que dice cómo manejar el residuo según el material sobre el que se aplicó. Después de un incendio, el residuo no es solo agente: es agente más lo que se estaba quemando.",
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "equipos",
|
||||
titulo: "Los equipos",
|
||||
descripcion: "Alcance declarado, certificaciones y cómo elegir sin sobredimensionar la compra.",
|
||||
preguntas: [
|
||||
{
|
||||
id: "alcance",
|
||||
pregunta: "¿Cuál es el alcance real de un extintor Enforcer?",
|
||||
respuesta: [
|
||||
"En el catálogo aparece como \"más de 10 m\", que es el dato declarado por la fuente. Lo publicamos con esa etiqueta y no lo convertimos en una cifra exacta.",
|
||||
"Un alcance solo significa algo junto con las condiciones de la medición: presión, boquilla, ángulo y agente. Eso viene en la ficha técnica del modelo, y es lo que pedimos antes de proponer una distribución de equipo.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "certificaciones",
|
||||
pregunta: "¿Los equipos tienen certificación UL o cumplen NFPA?",
|
||||
respuesta: [
|
||||
"La información pública de FSPM enumera referencias como UL 162, UL 711, NFPA 11, NFPA 16, NFPA 18, DIN EN 1568-3 y LASTFIRE, entre otras.",
|
||||
"Una referencia no es un certificado. Un listado aplica a una formulación o a un modelo concreto, con expediente, alcance y fecha, y no se traslada al resto del catálogo. Lo que entregamos es el certificado que corresponde al modelo que se te está ofreciendo.",
|
||||
"También conviene decirlo con claridad: ninguna norma sustituye a otra. Un listado UL no equivale a una NOM mexicana, y una prueba ambiental no acredita desempeño de extinción.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "elegir",
|
||||
pregunta: "¿Cómo sé qué equipo me corresponde?",
|
||||
respuesta: [
|
||||
"Por tres respuestas, en este orden: qué se quema en cada área, quién va a operar el equipo y en cuántos segundos, y qué documentación te van a pedir.",
|
||||
"La primera define la clase de fuego y por tanto el agente. La segunda define si el equipo debe ser portátil, móvil, fijo o de activación automática. La tercera define el expediente.",
|
||||
"El catálogo está construido para responder eso: se filtra por clase de fuego y por aplicación, no por nombre de producto.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "precio",
|
||||
pregunta: "¿Cuánto cuesta?",
|
||||
respuesta: [
|
||||
"No publicamos precios porque dependen de la configuración, la cantidad, la instalación y el servicio asociado. Preferimos decirlo antes de que llenes un formulario, no después.",
|
||||
"Lo que sí podemos anticipar es el criterio: el error caro casi nunca es el precio unitario, es comprar equipo que no corresponde a la clase de fuego del área o distribuirlo por metros cuadrados en lugar de por distancia de recorrido.",
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "normativa",
|
||||
titulo: "Normativa y documentación",
|
||||
descripcion: "Lo que una verificación pide y lo que debe acompañar a una compra.",
|
||||
preguntas: [
|
||||
{
|
||||
id: "nom-002",
|
||||
pregunta: "¿Qué me exige la NOM-002-STPS-2010?",
|
||||
respuesta: [
|
||||
NORMAS[0].aplica,
|
||||
"En términos prácticos: la clasificación del riesgo va primero y condiciona todo lo demás. Los umbrales de esa clasificación dependen del material y de la superficie de cada centro de trabajo, así que no los reproducimos aquí.",
|
||||
"Es una referencia orientativa. La normativa puede complementarse por estado y municipio, y esta página no sustituye un dictamen técnico ni jurídico.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "revision",
|
||||
pregunta: "¿Cada cuánto hay que revisar los extintores?",
|
||||
respuesta: [
|
||||
NORMAS[1].aplica,
|
||||
"Es la obligación recurrente que más seguido se pierde, y casi nunca por desconocerla: se pierde porque nadie quedó a cargo de la bitácora. Por eso, en una entrega, el formato de bitácora y el responsable nombrado son parte del alcance.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "documentos",
|
||||
pregunta: "¿Qué documentos debo exigir en una compra?",
|
||||
respuesta: [
|
||||
"Ficha técnica del modelo, hoja de datos de seguridad del agente, certificado o listado por modelo, garantía con condiciones por escrito, manual de operación y mantenimiento, y bitácora de revisión. Cuando hay instalación, además la constancia de puesta en marcha; cuando hay personal que operar, la constancia de capacitación.",
|
||||
"No todos aplican a todos los productos. El centro de evidencia tiene el índice de qué corresponde según la categoría.",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "descargas",
|
||||
pregunta: "¿Por qué no hay documentos para descargar en este sitio?",
|
||||
respuesta: [
|
||||
"Porque en la extracción pública del sitio de FSPM no apareció un índice verificable de documentos por número de modelo, y poner botones de descarga que no llevan a ningún archivo sería peor que no tenerlos.",
|
||||
"Los documentos se entregan por número de modelo, a solicitud, junto con la propuesta técnica. Y cuando un documento no exista o no cubra lo que se afirma, lo decimos en la propuesta.",
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export default function PaginaPreguntas() {
|
||||
const todas = GRUPOS.flatMap((g) => g.preguntas);
|
||||
|
||||
const jsonLd = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
mainEntity: todas.map((p) => ({
|
||||
"@type": "Question",
|
||||
name: p.pregunta,
|
||||
acceptedAnswer: {
|
||||
"@type": "Answer",
|
||||
text: p.respuesta.join(" "),
|
||||
},
|
||||
})),
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
||||
/>
|
||||
|
||||
{/* ---------- encabezado ---------- */}
|
||||
<section className="grid-bg bg-ink pt-12 pb-14 sm:pt-16 sm:pb-20">
|
||||
<div className="shell">
|
||||
<nav aria-label="Ruta de navegación" className="mb-8">
|
||||
<ol className="flex flex-wrap items-center gap-2 font-mono text-[0.625rem] uppercase tracking-[0.14em] text-faint">
|
||||
<li>
|
||||
<Link href="/" className="hover:text-bright">
|
||||
Inicio
|
||||
</Link>
|
||||
</li>
|
||||
<li aria-hidden="true">/</li>
|
||||
<li className="text-bright">Preguntas frecuentes</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div className="max-w-3xl anim-rise">
|
||||
<p className="eyebrow mb-5">Preguntas frecuentes</p>
|
||||
<h1 className="font-display text-[2rem] font-black uppercase leading-[1.03] tracking-tight sm:text-[2.75rem] lg:text-5xl">
|
||||
Las mismas preguntas, respondidas con lo que se puede documentar
|
||||
</h1>
|
||||
<p className="mt-6 text-base leading-relaxed text-muted sm:text-lg">
|
||||
Estas preguntas vienen de la página real de FSPM. Las respuestas no. Donde la fuente
|
||||
afirmaba algo sin condiciones, aquí se explica qué documento lo respalda y qué queda
|
||||
pendiente de confirmar por número de modelo. Es menos vistoso y sirve mucho más
|
||||
cuando llega la auditoría.
|
||||
</p>
|
||||
|
||||
<dl className="spec mt-9 sm:grid-cols-2">
|
||||
<div className="spec-cell">
|
||||
<dt className="spec-key">Preguntas</dt>
|
||||
<dd className="spec-val">{todas.length}</dd>
|
||||
</div>
|
||||
<div className="spec-cell">
|
||||
<dt className="spec-key">Temas</dt>
|
||||
<dd className="spec-val">{GRUPOS.length}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ---------- los grupos ---------- */}
|
||||
{GRUPOS.map((grupo, indice) => {
|
||||
const claro = indice % 2 === 0;
|
||||
return (
|
||||
<section
|
||||
key={grupo.id}
|
||||
id={grupo.id}
|
||||
aria-labelledby={`grupo-${grupo.id}`}
|
||||
className={[
|
||||
"border-t border-rule py-14 sm:py-20",
|
||||
claro ? "grid-bg-lite bg-paper" : "bg-ink",
|
||||
].join(" ")}
|
||||
>
|
||||
<div className="shell">
|
||||
<div className="grid gap-10 lg:grid-cols-[1fr_1.6fr] lg:gap-14">
|
||||
<Revelar className="lg:sticky lg:top-24 lg:self-start">
|
||||
<p
|
||||
className={[
|
||||
"font-mono text-[0.625rem] uppercase tracking-[0.16em]",
|
||||
claro ? "text-deep-muted" : "text-faint",
|
||||
].join(" ")}
|
||||
>
|
||||
Tema {String(indice + 1).padStart(2, "0")}
|
||||
</p>
|
||||
<h2
|
||||
id={`grupo-${grupo.id}`}
|
||||
className={[
|
||||
"mt-4 font-display text-2xl font-extrabold leading-tight sm:text-3xl",
|
||||
claro ? "text-deep" : "text-bright",
|
||||
].join(" ")}
|
||||
>
|
||||
{grupo.titulo}
|
||||
</h2>
|
||||
<p
|
||||
className={[
|
||||
"mt-4 text-sm leading-relaxed",
|
||||
claro ? "text-deep-muted" : "text-muted",
|
||||
].join(" ")}
|
||||
>
|
||||
{grupo.descripcion}
|
||||
</p>
|
||||
</Revelar>
|
||||
|
||||
<div className="space-y-3">
|
||||
{grupo.preguntas.map((pregunta) => (
|
||||
<details
|
||||
key={pregunta.id}
|
||||
id={pregunta.id}
|
||||
className={[
|
||||
"group rounded-[6px] border [-webkit-tap-highlight-color:transparent]",
|
||||
claro ? "border-rule-lite bg-white" : "border-rule bg-ink-2",
|
||||
].join(" ")}
|
||||
>
|
||||
<summary className="flex cursor-pointer list-none items-start justify-between gap-4 px-5 py-4 sm:px-6 sm:py-5">
|
||||
<span
|
||||
className={[
|
||||
"font-display text-base font-bold leading-snug sm:text-lg",
|
||||
claro ? "text-deep" : "text-bright",
|
||||
].join(" ")}
|
||||
>
|
||||
{pregunta.pregunta}
|
||||
</span>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className={[
|
||||
"mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-[2px] border font-mono text-sm transition-transform duration-200 group-open:rotate-45",
|
||||
claro
|
||||
? "border-rule-lite text-deep-muted"
|
||||
: "border-rule-2 text-muted",
|
||||
].join(" ")}
|
||||
>
|
||||
+
|
||||
</span>
|
||||
</summary>
|
||||
|
||||
<div
|
||||
className={[
|
||||
"space-y-4 border-t px-5 pb-6 pt-5 sm:px-6",
|
||||
claro ? "border-rule-lite" : "border-rule",
|
||||
].join(" ")}
|
||||
>
|
||||
{pregunta.respuesta.map((parrafo) => (
|
||||
<p
|
||||
key={parrafo.slice(0, 48)}
|
||||
className={[
|
||||
"text-sm leading-relaxed",
|
||||
claro ? "text-deep-muted" : "text-muted",
|
||||
].join(" ")}
|
||||
>
|
||||
{parrafo}
|
||||
</p>
|
||||
))}
|
||||
</div>
|
||||
</details>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
})}
|
||||
|
||||
{/* ---------- salidas ---------- */}
|
||||
<section className="border-t border-rule bg-ink-2 py-14 sm:py-16">
|
||||
<div className="shell">
|
||||
<div className="max-w-3xl">
|
||||
<p className="eyebrow mb-4">Si tu pregunta no está aquí</p>
|
||||
<h2 className="font-display text-2xl font-extrabold sm:text-3xl">
|
||||
Pregúntala directo, con el escenario incluido
|
||||
</h2>
|
||||
<p className="mt-4 text-sm leading-relaxed text-muted sm:text-base">
|
||||
Si la respuesta depende de un documento que no tenemos, te lo decimos. Es más útil que
|
||||
una respuesta cómoda.
|
||||
</p>
|
||||
<div className="mt-8 flex flex-wrap gap-3">
|
||||
<Link href="/contacto" className="btn btn-signal">
|
||||
Escribirnos
|
||||
</Link>
|
||||
<Link href="/evidencia" className="btn btn-ghost">
|
||||
Centro de evidencia
|
||||
</Link>
|
||||
<Link href="/cumplimiento-nom-002" className="btn btn-ghost">
|
||||
Cumplimiento NOM-002
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user