Saltar al contenido principal

Configuración del widget

Esta página es la fuente de verdad única de NeuroonWidgetConfig, verificada línea por línea contra el código fuente del widget (src/types.ts + src/context/ConfigContext.tsx) — no contra otras páginas de esta documentación. Si otra página del sitio (incluso el Snippet Builder) discrepa de lo que dice aquí, esta página tiene razón.

El widget acepta configuración por dos vías:

  1. Atributos data-* en el <script> para auto-init (server-rendered).
  2. NeuroonWidgetConfig vía window.NeuroonWidget.init(config) para control programático.

Ambas vías producen la misma instancia. Si pasas ambas, init(config) tiene prioridad.

Atributos data-*

AtributoRequeridoDefaultQué hace
data-tokenWidget Token firmado por tu servidor
data-containerno#neuroon-searchSelector CSS del contenedor. Si no coincide con ningún elemento, el auto-init aborta con un warning en consola
data-themenoautolight, dark, auto
data-localenoautodetect (fallback es)es, en, fr, de, it, pt, ca, eu, gl
data-api-urlnohttps://api.neuroon.aiOverride del host de la API. Disponible desde v0.9.19 — en versiones anteriores este atributo se ignoraba silenciosamente y apiUrl solo era alcanzable vía init()
data-placeholderno""Texto del input vacío
data-suggestionsnotrue"false" desactiva sugerencias
data-filtersnotrue"false" desactiva filtros
data-primary-colornoNo hace nada. Existe en el parser y valida el formato del color, pero el mapeo a CSS está vacío — no pinta ningún override visual. Usa styles.primary vía init() en su lugar

Estos son los únicos atributos que el widget lee del <script> — cualquier otro data-* se reenvía al tag pero se ignora en silencio. Para translations, cart, tracking, callbacks, monitoring o refreshEndpoint, usa init() programático.

NeuroonWidgetConfig

interface NeuroonWidgetConfig {
container: string | HTMLElement
token: string
apiUrl?: string // default: 'https://api.neuroon.ai'
fallbackApiUrl?: string // opcional — API secundaria si la búsqueda contra apiUrl falla (desde v0.9.23)
refreshEndpoint?: string // URL para refrescar el token; ver nota debajo
theme?: 'auto' | 'light' | 'dark' | 'detect' // default: 'auto'
locale?: 'es' | 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ca' | 'eu' | 'gl'
translations?: Partial<Translations>
styles?: StyleOverrides | { light?: StyleOverrides; dark?: StyleOverrides }
features?: FeatureFlags
ui?: UIOptions
tracking?: TrackingConfig
callbacks?: Callbacks
monitoring?: MonitoringConfig
cart?: CartConfig
}

FeatureFlags

interface FeatureFlags {
suggestions?: boolean // default: true — dropdown de sugerencias
filters?: boolean // default: true — filtros guiados
voiceSearch?: boolean // default: true — búsqueda por voz (requiere soporte del navegador)
imageSearch?: boolean // default: true — búsqueda por imagen
aiAssistant?: boolean // default: true — asistente conversacional
comparison?: boolean // default: true — comparador de productos (máx. 4)
mentions?: boolean // default: true — @menciones y drag&drop de productos en el chat
streaming?: boolean // default: true — streaming de tokens en respuestas del agente
agentSearch?: boolean // default: true — modo de búsqueda conversacional/agéntico
fastSearch?: boolean // default: false — modo de búsqueda instantánea, no conversacional (desde v0.9.19)
}

UIOptions

interface UIOptions {
placeholder?: string // default: '' — texto del input vacío
resultsPerPage?: number // default: 20 — resultados por página
showPrices?: boolean // default: true — mostrar precios
showBrands?: boolean // default: true — mostrar marcas
layout?: 'grid' | 'list' // default: 'grid' — ⚠️ no tiene efecto (ver nota)
displayMode?: 'fullscreen' | 'panel' // default: 'fullscreen'
fabPosition?: string // default: 'bottom-right' — posición del botón flotante
fabHint?: string // default: '' — texto del tooltip del FAB
overlayContainer?: HTMLElement | null // default: null — confina el overlay a este elemento (desde v0.9.26)
}

callbacks

interface Callbacks {
onSearch?: (query: string) => void
onResultClick?: (product: Product) => void
onFilterChange?: (filters: AppliedFilters) => void
onError?: (error: Error) => void
onTokenExpiring?: () => Promise<string>
onTokenRefreshed?: (newToken: string) => void
}

Los 6 campos están realmente cableados (verificado en App.tsx, useSearch.ts, useProductHandlers.ts, useSearchHandlers.ts). También existe onConversion?: (product: Product) => void en el tipo, pero no está cableado a nada — la atribución real de conversiones va por la cookie neuroon_clicks, no por este callback.

TrackingConfig

interface TrackingConfig {
clicks?: boolean // default: true — trackea clics en productos (real)
}

clicks dispara POST /api/widget/track/click en cada clic/add-to-cart de un producto y controla si se escribe la cookie de atribución neuroon_clicks, leída por el plugin de WordPress al completarse el pedido. El callback onConversion (ver arriba) sigue sin estar conectado a ningún flujo — la atribución real siempre va por esta cookie, no por ese callback.

monitoring (opcional)

interface MonitoringConfig {
applicationId: string
clientToken: string
// …opciones del SDK de Datadog RUM
}

Si lo configuras, el widget inicializa @datadog/browser-rum-slim de forma asíncrona — el RUM auto-instrumentado de Datadog (recursos, interacciones, long tasks) sí funciona. Los hooks de tracking custom del widget (trackAction/trackError) existen en el código pero ningún componente los invoca hoy — no esperes eventos custom propios en tu dashboard de Datadog, solo lo que Datadog captura automáticamente.

cart

Ver Integración de carrito para el contrato completo de CartConfig, CartState y CartOperationResult.

styles

Acepta un objeto plano (mismos valores para ambos temas) o uno por tema ({ light: {...}, dark: {...} }). Ver Theming y CSS Variables para la lista completa de campos.

Validación

ReglaMensaje
token ausente[NeuroonWidget] token is required
container ausente[NeuroonWidget] container is required
apiUrl no es URL válida[NeuroonWidget] Invalid apiUrl
theme no soportadowarning, fallback a auto
locale no soportadowarning, fallback a es
resultsPerPage <= 0[NeuroonWidget] resultsPerPage must be greater than 0

Próximas lecturas