Instalación del widget
Esta página describe la forma soportada de embeber el widget en producción: CDN versionado con Subresource Integrity (SRI), política Content-Security-Policy y fallback a una versión fija cuando @latest se mueve.
Requisitos previos
- Un Widget Token (cabecera
X-Widget-Token). Si no tienes uno, sigue Autenticación → Widget Token. - Un contenedor en tu plantilla, normalmente un
<div id="neuroon-search"></div>. - Acceso para añadir un
<script>en<head>o antes de</body>.
Versiones disponibles
Snippet base
<div id="neuroon-search"></div>
<script
src="https://cdn.neuroon.ai/widget/widget.js"
data-token="YOUR_WIDGET_TOKEN"
data-container="#neuroon-search"
data-theme="auto"
data-locale="es"
></script><div id="neuroon-search"></div>
<script
src="https://cdn.neuroon.ai/widget@0.9.10/widget.js"
data-token="WIDGET_TOKEN_AQUI"
data-container="#neuroon-search"
data-theme="auto"
data-locale="es"
data-api-url="https://api.neuroon.ai"
async
></script>
El script auto-inicializa: detecta el data-token, monta el Shadow DOM en el data-container (por defecto #neuroon-search si lo omites) y renderiza el UI. No tienes que llamar a ninguna API JavaScript adicional para el flujo estándar.
Subresource Integrity (SRI)
Cada release del widget publica un manifiesto SRI con el hash SHA-384 del bundle:
https://cdn.neuroon.ai/widget@0.9.10/sri-manifest.json
El manifiesto global de SRI para la última versión está en https://cdn.neuroon.ai/sri-manifest.json y la lista de versiones publicadas en https://cdn.neuroon.ai/versions.json.
Añádelo al <script> para que el navegador rechace cualquier modificación del CDN:
<script
src="https://cdn.neuroon.ai/widget@0.9.10/widget.js"
integrity="sha384-AbCdEf123…"
crossorigin="anonymous"
data-token="WIDGET_TOKEN_AQUI"
data-container="#neuroon-search"
async
></script>
Atributos data-*
El parser está en widget/src/core/config.ts (parseDataAttributes). Sólo estos atributos se leen — el resto se ignora.
| Atributo | Requerido | Valor |
|---|---|---|
data-token | sí | Widget Token (cadena opaca emitida por Neuroon). |
data-container | no | Selector CSS del contenedor. Default #neuroon-search. |
data-theme | no | auto (default), light, dark. |
data-locale | no | Uno de los 9 códigos soportados. Default es. |
data-api-url | no | Override del API base URL. Default https://api.neuroon.ai. |
data-primary-color | no | Hex/rgb del color primario (atajo legacy; preferir StyleOverrides). |
data-placeholder | no | Texto del input vacío. |
data-suggestions | no | false deshabilita el dropdown de sugerencias. |
data-filters | no | false deshabilita filtros y el drawer. |
Política Content-Security-Policy
Si tu host aplica CSP estricta, el widget necesita estas directives:
script-src 'self' https://cdn.neuroon.ai;
connect-src 'self' https://api.neuroon.ai https://browser-intake-datadoghq.eu;
img-src 'self' data: https:;
font-src 'self' https://rsms.me;
style-src 'self' 'unsafe-inline';
connect-src— el widget llama al API y, si está habilitado el monitoring opcional, reporta abrowser-intake-datadoghq.eu.font-src https://rsms.me— el widget pre-conecta y carga la familia Inter desdersms.me.style-src 'unsafe-inline'— necesario porque el widget inyecta<style>dentro del Shadow DOM. El Shadow DOM aísla esa hoja del documento del host.
Variantes por entorno
| Entorno | CDN | API |
|---|---|---|
| Producción | https://cdn.neuroon.ai/widget@0.9.10/widget.js | https://api.neuroon.ai |
| Desarrollo | mismo CDN, mismas versiones | https://dev-api.neuroon.ai |
Para apuntar a Desarrollo basta con data-api-url="https://dev-api.neuroon.ai". El bundle del widget es el mismo.
Inicialización programática (opcional)
El auto-init basta para la mayoría de integraciones. Si necesitas control fino (lazy-load, múltiples instancias, configuración dinámica desde el servidor), usa la API JavaScript:
const widget = window.NeuroonWidget.init({
container: '#neuroon-search',
token: 'WIDGET_TOKEN_AQUI',
apiUrl: 'https://api.neuroon.ai',
theme: 'auto',
locale: 'es',
})
// Métodos disponibles sobre la instancia
widget.setTheme('dark')
widget.setStyles({ primary: '#06b6d4' })
widget.destroy()
Próximas lecturas
- Configuración —
NeuroonWidgetConfigcompleto. - Theming — variables
--nrn-*y overrides por tema. - Autenticación → Widget Token — emisión y rotación.