Ir al contenido
winclus.com Volver a la portada

Integrar Winclus en tu sitio

Guía técnica para el widget 0.8.6. Winclus es tecnología de apoyo que se añade a un sitio: no lo hace conforme con la norma por sí solo. Para saber cómo está tu sitio, usa Winclus Audit.

En pocas palabras

1. Una línea

Antes de </body>, en la plantilla común de todas las páginas:

<script src="https://winclus.com/widget.js" async></script>

widget.js es siempre la última versión: cuando publicamos una mejora, tu sitio la tiene en menos de 5 minutos, sin cambiar nada. Es la forma recomendada.

No frena la página. widget.js es un cargador de unos 3 KB comprimido: el widget completo (winclus-widget.min.js, minificado) se pide cuando la página ya se pintó, o enseguida si la persona ya usa Winclus (tiene ajustes guardados, dejó la cámara encendida o llega con su perfil en el enlace). Alt+Mayús+W lo trae al momento. El código legible está en winclus-widget.js, para auditarlo.

Versión fija con integridad (solo si tu política de seguridad la exige)

Si tu entidad exige integridad de subrecursos (SRI) para los scripts de terceros, usa la copia fija de una versión con su hash:

<script src="https://winclus.com/widget-0.8.6.js" async
        integrity="sha384-SsvxH2DmER/b/WH6fN73Ud8ZtI67cpzF6HKAnPqsSlHO6jpXCjC3PlfIfPHj61ml"
        crossorigin="anonymous"></script>

El atributo integrity es el hash SHA-384 del archivo: el navegador comprueba que lo que llega es exactamente esa versión y, si no coincide, no lo ejecuta. A cambio, esta versión no se actualiza nunca: para recibir las mejoras tienes que cambiar tú el número y el hash por los de la última versión publicada aquí. widget.js no lleva hash porque cambia.

Atributos opcionales en el mismo <script>:

AtributoValoresQué hace
data-posicionderecha (defecto), izquierdaLado del botón flotante y del panel.
data-colorcolor CSSColor del botón flotante.
data-camaranoNo ofrece el puntero con la cara (todo lo demás sigue).
data-idiomaes-CO (defecto), es-MX, en-US…Idioma del reconocimiento de voz (dictado, órdenes, subtítulos en vivo).
data-uies, enIdioma de los textos del panel. Sin él, se toma del lang de la página.
data-relevonoQuita los botones al Centro de Relevo y al diccionario de LSC (para sitios fuera de Colombia).
data-explicarURLServicio propio de lectura fácil con IA (ver más abajo). Sin él, la lectura fácil funciona por reglas.
data-idiomasListaVersiones del sitio en otros idiomas, para el botón «Otro idioma» que pide la barra de accesibilidad de la Resolución 2893 de 2020 (Anexo 1, 4.3.2 b): data-idiomas="en=/en/, pt=https://…/pt/". Solo hace falta si el sitio no las declara ya con <link rel="alternate" hreflang>, con enlaces hreflang o con un selector de idioma con lang: Winclus las encuentra solo. Sin ninguna, el botón explica cómo traducir con el navegador.
data-describirURLServicio propio que describe las imágenes que el sitio publicó sin texto alternativo: recibe POST {imagen, contexto, idioma} y devuelve {texto}. La imagen va a tu servidor, no a Winclus. Sin él, el lector de Winclus da la mejor pista de la página (pie de foto, título, nombre del archivo) y dice que el sitio no la describió; nunca inventa una descripción.
data-contactomailto:… o URLA dónde llega «Avisar de una barrera» (pestaña Más): un correo, o una URL que reciba POST {url, texto, navegador, version, fecha, ayudas}. Sin él, Winclus busca en la página un enlace de correo de accesibilidad o de contacto; si no hay, copia el aviso para pegarlo en el buzón de quejas.
data-claveClave del sitioLa clave que da el panel de cliente. Con ella el panel toma de winclus.com tu marca y tus opciones (logo, nombre, color, lado, pestañas ocultas, cámara, idioma, contacto, arreglos) sin tocar código, y tu sitio recibe cifras de uso anónimas. Los atributos escritos en la línea mandan sobre lo del panel.
data-traducirURLServicio de traducción del sitio: recibe POST {textos: [...], de: "es", a: "en"} y devuelve {textos: [...]} en el mismo orden. Con él, «Otro idioma» ofrece «Traducir esta página» a 100 idiomas (texto, alt, placeholder, title y aria-label; se puede volver al original). Detrás puede ir DeepL, Google, Azure o LibreTranslate en tu servidor: el texto va a tu servicio, no a Winclus. Sin él, el botón explica cómo traducir con el navegador.
data-logoURLLogo de la entidad en la cabecera del panel (plan Entidad). Se ve sobre fondo blanco, 28 px de alto.
data-nombreTextoNombre de la entidad en la cabecera: «Alcaldía de … con Winclus».
data-ocultarcara, clics, escribir, oir, verPestañas que este sitio no quiere mostrar, separadas por comas (por ejemplo un intranet sin cámara: data-ocultar="cara"). Inicio y Más salen siempre. Las opciones de «¿Qué te cuesta?» que lleven a una pestaña oculta no hacen nada.
data-arreglosno · informe · siLos arreglos al vuelo. En un sitio privado van puestos por defecto: Winclus pone en la página lo que le falta para los lectores de pantalla, el teclado y el zoom, y lo anota para quien mantiene el sitio. En un sitio público van en informe: Winclus no cambia la página y solo lista lo que falta en el código. no los apaga del todo y si los pone también en un sitio público.
data-apartarsenoPor defecto Winclus empieza dormido: no cambia la página y los lectores de pantalla no lo encuentran hasta que alguien mueve el ratón, toca la pantalla o pulsa Alt+Mayús+W. Y si nota que la persona usa un lector de pantalla (NVDA, JAWS…) se aparta solo: deshace lo que cambió en la página, se calla y deja un único botón pequeño para volver a activarlo. Se decide en el navegador de la persona y no se envía a ningún sitio. no lo impide.
data-entidadpublicaMarca el sitio como de una entidad pública aunque su dominio no sea .gov.co, .gov, .gob.xx o .mil.co (esos se reconocen solos): los arreglos pasan a informe.
data-completowinclus-widget.jsCargar el código legible en vez del minificado (para depurar).
data-glosarioURLJSON {"palabra": "definición"} con el glosario del sitio para «Diccionario al tocar una palabra» (o window.WinclusGlosario con ese objeto). Manda sobre ARASAAC y Wikcionario. Sin él, el diccionario usa el glosario de trámites del widget, ARASAAC y Wikcionario.

2. Política de seguridad de contenido (CSP)

Winclus vive en un shadow root y no usa atributos style en línea, así que no necesita 'unsafe-inline'. Si tu CSP usa nonce, ponlo en el <script>: el widget lo propaga a los <style> que inyecta. Directivas mínimas:

script-src 'nonce-XYZ' https://winclus.com;
style-src  'nonce-XYZ';
img-src    https://static.arasaac.org data:;       /* pictogramas */
connect-src https://winclus.com https://api.arasaac.org https://es.wiktionary.org;
           /* winclus.com: detector de caras y diccionario de palabras, la primera vez. ARASAAC y Wikcionario: opcionales,
              solo para «Diccionario al tocar una palabra»; sin ellos responde el glosario del sitio (data-glosario) */
font-src   https://winclus.com;                    /* opcional: la letra para dislexia (OpenDyslexic); sin esto, usa Verdana */
media-src  blob:;                                  /* la cámara, si se permite */
<script nonce="XYZ" src="https://winclus.com/widget.js" async></script>

3. Web component, React, Vue, Angular, Svelte

Con winclus-elemento.js el widget es un elemento HTML. Sirve en cualquier framework y evita manipular el <head> a mano.

<script src="https://winclus.com/winclus-elemento.js" async></script>
<winclus-widget posicion="izquierda" idioma="es-CO"></winclus-widget>

React (en el componente raíz, una sola vez):

useEffect(() => {
  const s = document.createElement("script");
  s.src = "https://winclus.com/widget.js"; s.async = true; s.dataset.idioma = "es-CO";
  document.body.appendChild(s);
}, []);

Vue (en App.vue, onMounted) es idéntico. Angular: en ngOnInit del componente raíz. Svelte: en onMount. En todos los casos, el widget se inicializa una vez y sobrevive a la navegación interna (SPA); si el contenido cambia, no hace falta avisarle.

Desde JavaScript puedes hablarle: Winclus.abrir(), Winclus.cerrar(), Winclus.leer(), Winclus.decir("texto"), Winclus.teclado(), Winclus.orden("baja"), Winclus.ajustes (los ajustes vivos), Winclus.caja (el shadow root).

3b. Arreglos al vuelo para todas las ayudas técnicas

Al cargar, y cada vez que llega contenido nuevo, Winclus pone en la página lo que le falta para NVDA, JAWS, VoiceOver, TalkBack o el Narrador, no solo para su propio lector: lang en <html>, alt en imágenes a partir de lo que ya dice la página (título, pie de foto, texto del enlace o nombre del archivo; con data-describir, la descripción de tu servicio; nunca un texto inventado), nombre de botones y enlaces que solo llevan un icono, enlaces «aquí» y «leer más» con su contexto, etiquetas de campos sin etiqueta, enlace «Saltar al contenido», zona principal, foco visible cuando el sitio lo quita, zoom permitido cuando el viewport lo prohíbe, título de los iframes, cabeceras de tablas y controles en vídeos que arrancan solos con sonido.

Lo que no se puede arreglar sin riesgo (ids repetidos, saltos de nivel en los títulos, tabindex positivos, controles ocultos con aria-hidden, imágenes sin ninguna pista) se anota. En la pestaña Más del panel, «Lo que Winclus arregló en esta página» lista cada arreglo con su selector y deja copiarla para quien mantiene el sitio: un parche al vuelo ayuda hoy, pero no es cumplimiento; la corrección va en el código. Desde JavaScript: Winclus.arreglos(), Winclus.pendientes() y Winclus.informeArreglos().

En sitios públicos, informe en vez de arreglos. La Comisión Europea, el Foro Europeo de la Discapacidad y la IAAP piden que la accesibilidad se arregle en el código, no en el navegador. Por eso, en un dominio de gobierno (o con data-entidad="publica") Winclus no cambia nada de la página: prueba los mismos arreglos, los anota y los deshace en el acto. La lista dice a la entidad qué poner en su código y de dónde sacar cada dato. La ayuda a la persona (lupa, lectura, voz, cara, pulsador, pictogramas) funciona igual.

4. WordPress, Drupal, Joomla, PrestaShop y 20 plataformas más

Dónde pegar la línea en cada plataforma (Magento, Shopify, Wix, Squarespace, Webflow, Framer, HubSpot, Ghost, Moodle, Odoo, Blogger, Weebly, Jimdo, SharePoint…), el plugin de Joomla, el módulo de PrestaShop y la etiqueta lista para Google Tag Manager: winclus.com/plataformas.

WordPress: copia la carpeta integraciones/wordpress/winclus (se entrega con el acuerdo) a wp-content/plugins/ y actívalo. En Ajustes → Winclus eliges posición, cámara, idioma, Centro de Relevo, servicio de IA y la versión: por defecto «Siempre la última», que recibe las mejoras sola; la fija con integridad es para quien la exija.

Drupal 9, 10 u 11: copia integraciones/drupal/winclus a modules/custom/ y actívalo (drush en winclus). Adjunta a todas las páginas widget.js, que se actualiza solo; los atributos y la versión fija con integridad (winclus/widget_fija) están en winclus.libraries.yml.

5. Sedes electrónicas en Colombia: GOV.CO y MiColombiaDigital

Las plantillas de GOV.CO y de MiColombiaDigital permiten incluir scripts en el pie de todas las páginas desde la administración del sitio (bloque de «código en el pie» o el pie de la plantilla). Pega ahí la línea del punto 1 con data-idioma="es-CO". Recomendaciones para sujetos obligados por la Resolución 1519:

6. Lectura fácil con tu propio servicio de IA

Con data-explicar="https://tu-servidor/explicar", el botón «Explicar en fácil» envía el texto de la página a tu servicio y muestra lo que devuelve (así los datos van a un servidor tuyo, no a uno de Winclus). Contrato:

POST /explicar            Content-Type: application/json
{ "texto": "…texto de la página…", "idioma": "es", "titulo": "Título" }

200 OK                    Content-Type: application/json
{ "texto": "# Resumen\n\nFrases cortas…\n\n# Pasos\n\n…" }   /* párrafos separados por línea en blanco; «# » hace un título */

Si el servicio falla, el widget usa las reglas locales. Un ejemplo de servicio con la API de Claude en Node o Python cabe en 30 líneas: recibe el texto, pide «reescríbelo en lenguaje claro, frases de menos de 20 palabras, sin jerga, con los pasos en lista» y devuelve el resultado.

7. Winclus Audit, Winclus Monitor y el informe de conformidad (ACR)

Escáner de accesibilidad: axe-core (WCAG 2.1 y 2.2 AA) en escritorio y móvil, más comprobaciones de la Resolución 1519 (texto al 200 %, declaración, ir al contenido, subtítulos, CAPTCHA que bloquean el trámite y sesiones que caducan sin aviso), cada una con el número y el nombre oficial de su criterio del Anexo 1. Genera un informe agrupado por criterio con cómo corregir cada cosa y un borrador de declaración de accesibilidad.

Se entrega con el acuerdo de soporte. Ejecución: node auditar.js https://tu-sitio.gov.co --entidad "Alcaldía de …" --salida informe. Pídelo en hola@winclus.com.

Informe de conformidad (ACR, plantilla VPAT 2.5). En la misma ejecución sale acr.html y acr.md: los 55 criterios de nivel A y AA de las WCAG 2.1 y 2.2, cada uno con su cláusula de la EN 301 549 y la Sección 508, en tres estados: «No cumple» con los elementos, «Cumple (evaluación automática)» y «Pendiente de revisión manual» con lo que hay que comprobar. Nunca marca «Cumple» a secas: una persona lo completa y lo firma. Es el documento que piden los pliegos y los compradores públicos.

Winclus Monitor: que nada empeore sin que nadie se entere. node monitor.js monitor.json pasa el escáner cada día por las páginas de la lista y por las del sitemap.xml, compara con la vez anterior, guarda el historial, actualiza un panel (panel.html: total, evolución, cada página con su cambio, si tiene el widget y el enlace a la declaración) y avisa por correo, por webhook (Slack, Teams, n8n, Make) o abriendo un issue si aparece una barrera nueva, una página deja de responder, el widget desaparece o se pierde la declaración. Se programa con monitor.ps1 (Programador de tareas de Windows), con cron o con la plantilla de GitHub Actions integraciones/github/winclus-monitor.yml. Sin límite de páginas ni de sitios.

Un escáner detecta entre el 30 y el 50 % de las barreras; el resto sale de la revisión manual y de probar con personas con discapacidad. El informe lo dice.

7b. Panel de cliente: clave de sitio, marca, cifras y monitor alojado

En winclus.com/panel se entra con un enlace al correo (sin contraseña) y se crea el sitio. Cada sitio recibe una clave que se añade a la línea: data-clave="…". Desde ese momento:

Los límites de cada plan (sitios, sitios de prueba, páginas vigiladas, personas del equipo) están en precios.

8. Idiomas del panel

El panel habla el idioma de la página (atributo lang, o data-ui). De fábrica, 101 idiomas: las 24 lenguas oficiales de la Unión Europea, catalán, euskera y gallego; las grandes lenguas de Asia, África y Oriente Medio; chino simplificado y tradicional (Taiwán y Hong Kong, detectado por el lang de la página); y en América, quechua, guaraní, aimara y criollo haitiano. La lista completa con su nombre en cada lengua está en el panel en 101 idiomas. Español e inglés van dentro del widget; los demás son archivos idiomas/pt.json, fr.json, ar.json… (el código de dos letras del idioma) que el cargador trae solo cuando hacen falta. En árabe el panel entero se voltea de derecha a izquierda (con la versión fija hay que servirlos junto al script o cargarlos como abajo). Para otro idioma, copia uno de esos archivos, tradúcelo y sírvelo como idiomas/xx.json junto a tu copia del widget, o define antes de cargar el widget un objeto con las cadenas en español como clave:

<script nonce="XYZ">
  window.WinclusIdiomas = { pt: { "Ver mejor": "Ver melhor", "Tamaño del texto": "Tamanho do texto", /* … */ } };
</script>
<script nonce="XYZ" src="https://winclus.com/widget.js" data-ui="pt" async></script>

Lo que no esté traducido sale en español. Las voces, el reconocimiento y la lectura de la página siguen el idioma de la página (lang) y data-idioma. Para verlos sin instalar nada: el panel en 18 idiomas, con un selector.

Componentes de terceros

Pictogramas de ARASAAC (CC BY-NC-SA). Detector de caras MediaPipe (Google), que no patrocina ni respalda este producto.