{"id":11032,"date":"2026-06-22T09:32:07","date_gmt":"2026-06-22T07:32:07","guid":{"rendered":"https:\/\/vincesconsulting.com\/wats\/"},"modified":"2026-06-24T10:51:52","modified_gmt":"2026-06-24T08:51:52","slug":"wats","status":"publish","type":"page","link":"https:\/\/vincesconsulting.com\/en\/technology\/wats\/","title":{"rendered":"Wats"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11032\" class=\"elementor elementor-11032 elementor-11019\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fb775a4 e-con-full e-flex e-con e-parent\" data-id=\"fb775a4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5d28f2b elementor-widget elementor-widget-html\" data-id=\"5d28f2b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n\n<!--\n  Dashboard Vinces \u00b7 p\u00e1gina standalone por producto\n  Generado: 2026-05-13T10:34:51.200Z\n  Endpoint API: https:\/\/vision360.vincesconsulting.com\/api\/dashboard-publico\/wats\/\n\n  C\u00f3mo integrarlo en WordPress:\n    1. Editor de la p\u00e1gina \u2192 bloque 'HTML personalizado'.\n    2. Pega el fichero completo (todo, incluyendo <html>, <head>, <body>).\n       En la mayor\u00eda de temas WP basta con pegar a partir de <body>.\n    3. Aseg\u00farate de que el dominio WP est\u00e1 incluido en CORS del backend.\n    4. El cliente refresca cada 30 min; el backend cachea 1h.\n-->\n<html lang=\"en\"><head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<title>WATS: conversation topics of the political parties \u00b7 Social intelligence \u00b7 Vinces<\/title>\n<meta name=\"description\" content=\"WATS, la inteligencia social de Vinces. An\u00e1lisis autom\u00e1tico de los principales temas que los decisores pol\u00edticos y grupos parlamentarios est\u00e1n tratando en redes sociales y medios. Clasificado por \u00e1mbito sectorial y sentimiento (positivo, negativo, neutro o mixto).\">\n<meta name=\"keywords\" content=\"WATS, inteligencia social pol\u00edtica, temas de conversaci\u00f3n, redes sociales, X Twitter LinkedIn, sentimiento positivo negativo, an\u00e1lisis reputacional, narrativas pol\u00edticas, monitorizaci\u00f3n medios, decisores pol\u00edticos, qu\u00e9 hablan PSOE PP VOX Sumar, Vinces consulting\">\n<meta name=\"author\" content=\"Vinces Consulting\">\n<meta name=\"robots\" content=\"index,follow,max-image-preview:large,max-snippet:-1\">\n<link rel=\"canonical\" href=\"https:\/\/vincesconsulting.com\/wats\/\">\n\n<meta property=\"og:type\" content=\"website\">\n<meta property=\"og:site_name\" content=\"Vinces Consulting\">\n<meta property=\"og:title\" content=\"WATS \u00b7 Inteligencia social pol\u00edtica \u00b7 Vinces\">\n<meta property=\"og:description\" content=\"Temas de conversaci\u00f3n de los partidos pol\u00edticos detectados en redes y medios, por \u00e1mbito y sentimiento.\">\n<meta property=\"og:locale\" content=\"en_GB\">\n<meta property=\"og:url\" content=\"https:\/\/vincesconsulting.com\/wats\/\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:title\" content=\"WATS \u00b7 Inteligencia social\">\n<meta name=\"twitter:description\" content=\"Qu\u00e9 hablan los decisores en redes: temas, frecuencia y sentimiento.\">\n\n<script type=\"application\/ld+json\" id=\"ld-json-page\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"WebPage\",\n  \"name\": \"WATS \u00b7 Inteligencia social pol\u00edtica\",\n  \"description\": \"Principales temas de conversaci\u00f3n de los decisores pol\u00edticos en redes sociales y medios digitales, clasificados por \u00e1mbito sectorial y sentimiento.\",\n  \"inLanguage\": \"es\",\n  \"isPartOf\": {\"@type\":\"WebSite\",\"name\":\"Vinces Consulting\",\"url\":\"https:\/\/vincesconsulting.com\"},\n  \"publisher\": {\"@type\":\"Organization\",\"name\":\"Vinces Consulting\",\"url\":\"https:\/\/vincesconsulting.com\",\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/vinces-consulting\/\"]},\n  \"breadcrumb\": {\"@type\":\"BreadcrumbList\",\"itemListElement\":[\n    {\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\/\/vincesconsulting.com\/\"},\n    {\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tecnolog\u00eda\",\"item\":\"https:\/\/vincesconsulting.com\/tecnologia\/\"},\n    {\"@type\":\"ListItem\",\"position\":3,\"name\":\"WATS\"}\n  ]}\n}\n<\/script>\n<script type=\"application\/ld+json\" id=\"ld-json-faq\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\":\"Question\",\"name\":\"\u00bfDe qu\u00e9 temas hablan los grupos pol\u00edticos en redes sociales?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"WATS detecta y agrupa los temas m\u00e1s tratados por decisores pol\u00edticos en redes sociales por \u00e1mbito (sanidad, vivienda, econom\u00eda, educaci\u00f3n, fiscalidad, medio ambiente, energ\u00eda, social, infraestructuras, pol\u00edtica) y sentimiento (positivo, negativo, neutro o mixto).\"}},\n    {\"@type\":\"Question\",\"name\":\"\u00bfQu\u00e9 redes monitoriza WATS?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"X (Twitter), LinkedIn, Facebook, Instagram, YouTube, TikTok, Telegram p\u00fablico, blogs pol\u00edticos y medios digitales.\"}},\n    {\"@type\":\"Question\",\"name\":\"\u00bfWATS detecta crisis reputacionales?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"S\u00ed. WATS alerta cuando un tema asociado a tu organizaci\u00f3n (o a tu sector) entra en una din\u00e1mica negativa o de viralizaci\u00f3n r\u00e1pida.\"}},\n    {\"@type\":\"Question\",\"name\":\"\u00bfWATS hace an\u00e1lisis comparativo entre partidos?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"S\u00ed. Puedes comparar c\u00f3mo PSOE, PP, VOX, Sumar, ERC, Junts, EH Bildu, PNV o cualquier grupo aborda un tema, con qu\u00e9 intensidad y con qu\u00e9 sentimiento.\"}}\n  ]\n}\n<\/script>\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Libre+Franklin:wght@400;500;600;700&amp;family=Manrope:wght@500;600;700;800&amp;family=Lato:wght@400;700&amp;display=swap\">\n<script defer=\"\" src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.1\/dist\/chart.umd.min.js\"><\/script>\n\n<style>\n\/* =========================================================\n   Vinces \u00b7 Dashboards p\u00fablicos \u2014 capa visual redesign\n   Mantiene todas las clases del HTML\/JS original e\n   incorpora la identidad de vincesconsulting.com (hero\n   navy, kicker naranja, tipograf\u00eda display, CTAs p\u00edldora).\n   ========================================================= *\/\n:root{\n  --navy:#1F2547;\n  --navy-deep:#161A36;\n  --navy-light:#2A3158;\n  --navy-soft:#E9ECF3;\n  --orange:#F3A53A;\n  --orange-soft:#FFF1DA;\n  --green:#1FA886;\n  --bg:#EEF1F3;\n  --bg-alt:#F6F8FA;\n  --card:#FFFFFF;\n  --ink:#1F2547;\n  --ink-soft:#5A6076;\n  --muted:#8A90A3;\n  --line:#E2E6EE;\n  --line-soft:#EDF0F5;\n  --good:#1FA886;\n  --warn:#E5A040;\n  --bad:#C0392B;\n\n  \/* Aliases para mantener compatibilidad con el CSS original *\/\n  --vinces-primary:var(--navy);\n  --vinces-secondary:var(--orange);\n  --vinces-dark:var(--navy-deep);\n  --panel:var(--card);\n  --panel-soft:var(--bg-alt);\n  --brand:var(--navy);\n  --brand-soft:var(--navy-soft);\n  --brand-light:var(--navy-light);\n  --accent:var(--orange);\n  --accent-soft:var(--orange-soft);\n  --accent-dark:#D88E25;\n\n  --radius:18px;\n  --radius-sm:10px;\n  --radius-pill:999px;\n  --shadow:0 1px 2px rgba(31,37,71,.04), 0 8px 24px rgba(31,37,71,.06);\n  --shadow-lg:0 4px 12px rgba(31,37,71,.06), 0 24px 60px rgba(31,37,71,.12);\n\n  --hm-0:#F1F3F7;--hm-1:#DDE2EE;--hm-2:#B8C2D9;\n  --hm-3:#7889B0;--hm-4:#42507A;--hm-5:#1F2547;\n\n  --font-display:\"Libre Franklin\",-apple-system,BlinkMacSystemFont,sans-serif;\n  --font-body:\"Lato\",\"Libre Franklin\",-apple-system,BlinkMacSystemFont,sans-serif;\n}\n\n*{box-sizing:border-box}\nhtml,body{margin:0;padding:0}\nbody{\n  font-family:var(--font-body);\n  background:var(--bg);\n  color:var(--ink);\n  line-height:1.65;\n  -webkit-font-smoothing:antialiased;\n  text-rendering:optimizeLegibility;\n}\n\n\/* =========================================================\n   HERO full-bleed (estilo Vinces)\n   ========================================================= *\/\n.vc-hero{\n  position:relative;\n  background:var(--navy);\n  color:#fff;\n  padding:96px 24px 88px;\n  overflow:hidden;\n}\n.vc-hero::before{\n  content:\"\";\n  position:absolute;inset:0;\n  background:\n    radial-gradient(circle at 88% 18%, rgba(243,165,58,.10), transparent 45%),\n    radial-gradient(circle at 8% 95%, rgba(31,168,134,.07), transparent 50%);\n  pointer-events:none;\n}\n.vc-hero::after{\n  content:\"\";\n  position:absolute;left:0;right:0;bottom:0;height:1px;\n  background:linear-gradient(90deg, transparent, rgba(243,165,58,.45), transparent);\n}\n.vc-hero-inner{\n  position:relative;\n  max-width:1240px;margin:0 auto;\n  display:grid;grid-template-columns:1fr;gap:28px;\n}\n@media(min-width:880px){\n  .vc-hero-inner{grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:48px}\n}\n.vc-kicker{\n  display:inline-block;\n  color:var(--orange);\n  font-family:var(--font-display);\n  font-weight:700;font-size:.78rem;\n  letter-spacing:.18em;text-transform:uppercase;\n  margin:0 0 22px;line-height:1.2;\n}\n.vc-kicker::before{content:\"\/\/ \"}\n.vc-hero h1{\n  font-family:var(--font-display);\n  font-size:clamp(2.4rem,5.6vw,4.8rem);\n  font-weight:800;\n  letter-spacing:-.035em;\n  line-height:.98;\n  margin:0 0 24px;\n  color:#fff;\n  text-wrap:balance;\n}\n.vc-hero-lead{\n  font-size:clamp(1rem,1.25vw,1.15rem);\n  color:rgba(255,255,255,.78);\n  max-width:680px;\n  line-height:1.55;\n  margin:0 0 28px;\n}\n.vc-hero-lead strong{color:#fff;font-weight:600}\n.vc-hero-meta{\n  display:inline-flex;align-items:center;gap:10px;\n  background:rgba(255,255,255,.05);\n  border:1px solid rgba(255,255,255,.14);\n  padding:9px 18px;\n  border-radius:999px;\n  font-size:.8rem;\n  color:rgba(255,255,255,.85);\n  backdrop-filter:blur(6px);\n}\n.vc-hero-meta .dot{\n  width:8px;height:8px;border-radius:50%;\n  background:#4ADE80;\n  box-shadow:0 0 0 4px rgba(74,222,128,.18);\n}\n.vc-hero-meta.err .dot{background:#FCA5A5;box-shadow:0 0 0 4px rgba(252,165,165,.18)}\n.vc-hero-meta.err{color:#FCA5A5;border-color:rgba(252,165,165,.25)}\n\n.vc-hero-cta{\n  display:inline-flex;align-items:center;gap:14px;\n  background:#fff;color:var(--navy);\n  padding:14px 16px 14px 26px;\n  border-radius:999px;\n  text-decoration:none;\n  font-family:var(--font-display);\n  font-weight:700;font-size:1.45rem;\n  transition:transform .15s ease, box-shadow .2s ease;\n  align-self:start;\n}\n.vc-hero-cta:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.25)}\n.vc-hero-cta .ico{\n  width:30px;height:30px;border-radius:50%;\n  background:var(--navy);color:#fff;\n  display:inline-flex;align-items:center;justify-content:center;\n  font-size:1.45rem;font-weight:400;\n  transition:transform .2s ease;\n}\n.vc-hero-cta:hover .ico{transform:rotate(-12deg)}\n\n\/* =========================================================\n   Layout principal (sustituye al .wrap inline)\n   ========================================================= *\/\n.wrap{max-width:1240px;margin:0 auto;padding:56px 24px 96px}\n@media(max-width:768px){.wrap{padding:40px 18px 64px}}\n\n\/* Cabecera vieja: la ocultamos porque ahora vive en el hero *\/\nheader.page{display:none}\n\nnoscript .nojs{\n  background:#FFF7ED;border:1px solid #FED7AA;color:#9A3412;\n  padding:16px 20px;border-radius:var(--radius-sm);margin-bottom:24px;font-size:.9rem;\n}\n\n\/* =========================================================\n   PRODUCT SECTION \u2014 card grande con dos columnas\n   ========================================================= *\/\n.product-section{\n  margin:0 0 40px;\n  background:var(--card);\n  border:1px solid var(--line);\n  border-radius:var(--radius);\n  box-shadow:var(--shadow);\n  overflow:hidden;\n  position:relative;\n}\n.product-section::before{\n  content:\"\";position:absolute;top:0;left:0;\n  width:160px;height:4px;\n  background:linear-gradient(90deg,var(--navy) 0%,var(--orange) 100%);\n}\n.product-grid{display:grid;grid-template-columns:1fr;gap:0}\n@media(min-width:1020px){\n  .product-grid{grid-template-columns:360px 1fr}\n  .product-grid.reverse{grid-template-columns:1fr 360px}\n}\n.product-info{\n  padding:48px 38px;\n  background:linear-gradient(180deg,#FAFBFC 0%, #F0F3F7 100%);\n  border-right:1px solid var(--line);\n  display:flex;flex-direction:column;gap:18px;\n}\n.product-grid.reverse .product-info{\n  border-right:0;border-left:1px solid var(--line);order:2;\n}\n@media(max-width:1019px){\n  .product-info{padding:32px 24px;border-right:0;border-left:0;border-bottom:1px solid var(--line)}\n  .product-grid.reverse .product-info{order:0;border-left:0;border-bottom:1px solid var(--line)}\n}\n\n.product-badge{\n  display:inline-block;\n  color:var(--orange);\n  font-family:var(--font-display);\n  font-weight:700;font-size:.72rem;\n  letter-spacing:.16em;text-transform:uppercase;\n  background:transparent;padding:0;border:0;\n  align-self:flex-start;line-height:1.2;\n}\n.product-badge::before{content:\"\/\/ \"}\n.product-badge.brand{color:var(--navy)}\n\n.product-name{\n  font-family:var(--font-display);\n  font-size:clamp(1.7rem,2.4vw,2.2rem);\n  font-weight:800;color:var(--navy);\n  margin:0;letter-spacing:-.025em;line-height:1.05;\n  text-wrap:balance;\n}\n.product-tagline{\n  font-size:1rem;color:var(--ink-soft);\n  margin:0;line-height:1.7;\n}\n.product-tagline strong{color:var(--ink);font-weight:600}\n\n.product-content{padding:42px 38px;min-width:0}\n@media(max-width:1019px){.product-content{padding:30px 24px}}\n.product-content-header{\n  display:flex;align-items:flex-start;justify-content:space-between;\n  gap:16px;flex-wrap:wrap;margin-bottom:22px;\n}\n.product-content-header h3{\n  margin:0;\n  font-family:var(--font-display);\n  font-size:clamp(1.25rem,1.6vw,1.55rem);\n  font-weight:700;color:var(--navy);\n  letter-spacing:-.02em;line-height:1.2;\n}\n.product-content-header .sub{\n  font-size:1.45rem;color:var(--ink-soft);\n  margin:8px 0 0;line-height:1.55;max-width:62ch;\n}\n\n\/* =========================================================\n   CTA p\u00edldora \u2014 el patr\u00f3n Vinces \"Contacta con nosotros \u2197\"\n   ========================================================= *\/\n.pane-cta,\n.product-cta,\n.dl-btn{\n  display:inline-flex;align-items:center;gap:12px;\n  background:var(--navy);color:#fff;\n  padding:13px 18px 13px 26px;\n  border-radius:999px;\n  text-decoration:none;\n  font-family:var(--font-display);\n  font-weight:700;font-size:.88rem;\n  transition:transform .15s ease, box-shadow .2s ease, background .2s ease;\n  border:0;cursor:pointer;line-height:1;\n  white-space:nowrap;\n}\n.pane-cta::after,\n.product-cta::after{content:none}\n.pane-cta::before,\n.product-cta::before,\n.dl-btn::before{\n  order:2;\n  content:\"\\2197\";\n  width:26px;height:26px;border-radius:50%;\n  background:rgba(255,255,255,.16);\n  display:inline-flex;align-items:center;justify-content:center;\n  font-size:1.25rem;font-weight:500;\n  transition:transform .25s ease;\n}\n.pane-cta:hover,\n.product-cta:hover,\n.dl-btn:hover{\n  background:var(--navy-light);\n  transform:translateY(-2px);\n  box-shadow:0 10px 24px rgba(31,37,71,.18);\n  color:#fff;\n}\n.pane-cta:hover::before,\n.product-cta:hover::before{transform:translate(2px,-2px) rotate(-8deg)}\n\n.pane-cta-row{\n  margin-top:28px;padding:22px 24px;\n  background:var(--bg-alt);\n  border:1px solid var(--line-soft);\n  border-radius:var(--radius-sm);\n  display:flex;flex-wrap:wrap;align-items:center;gap:18px;\n}\n.pane-cta-row .pane-cta-text{\n  flex:1;min-width:240px;\n  font-size:1.45rem;color:var(--ink-soft);\n  margin:0;line-height:1.6;\n}\n.pane-cta-row .pane-cta-text strong{color:var(--ink);font-weight:700}\n.content-cta-row{\n  margin-top:32px;padding:24px 26px;\n  background:linear-gradient(135deg, var(--navy) 0%, var(--navy-deep) 100%);\n  color:#fff;\n  border-radius:var(--radius-sm);\n  display:flex;flex-wrap:wrap;align-items:center;gap:20px;\n}\n.content-cta-row .pane-cta-text{\n  flex:1;min-width:240px;\n  font-size:1.45rem;color:rgba(255,255,255,.78);\n  margin:0;line-height:1.6;\n}\n.content-cta-row .pane-cta-text strong{color:#fff;font-weight:700}\n.content-cta-row .pane-cta{\n  background:#fff;color:var(--navy);\n}\n.content-cta-row .pane-cta::before{background:var(--navy);color:#fff}\n.content-cta-row .pane-cta:hover{background:var(--orange);color:var(--navy)}\n.content-cta-row .pane-cta:hover::before{background:var(--navy);color:#fff}\n\n\/* Updated pill compatible con c\u00f3digo original (queda oculto en hero, pero el JS a\u00fan escribe en \u00e9l) *\/\n.updated{\n  font-size:.8rem;color:var(--ink-soft);\n  background:var(--card);border:1px solid var(--line);\n  padding:8px 16px;border-radius:999px;\n  display:inline-flex;align-items:center;gap:8px;\n}\n.updated .dot{width:8px;height:8px;border-radius:50%;background:var(--good);box-shadow:0 0 0 4px rgba(31,168,134,.15)}\n.updated.err .dot{background:var(--bad);box-shadow:0 0 0 4px rgba(192,57,43,.15)}\n.updated.err{color:var(--bad);border-color:#FECACA}\n\n\/* =========================================================\n   Carrusel de tabs (PolicyAlert)\n   ========================================================= *\/\n.car-tabs{\n  display:flex;gap:6px;margin:-8px 0 28px;\n  padding:6px;background:var(--bg-alt);\n  border:1px solid var(--line-soft);border-radius:999px;\n  flex-wrap:wrap;width:fit-content;max-width:100%;\n}\n.car-tab{\n  background:transparent;border:0;\n  padding:10px 20px;font-weight:600;font-size:1.25rem;\n  color:var(--ink-soft);cursor:pointer;\n  font-family:var(--font-display);\n  border-radius:999px;\n  transition:all .15s ease;\n  line-height:1.2;\n}\n.car-tab:hover{color:var(--navy)}\n.car-tab.active{\n  background:var(--navy);color:#fff;\n  box-shadow:0 2px 8px rgba(31,37,71,.18);\n}\n.car-pane{display:none}\n.car-pane.active{display:block;animation:vc-fade .35s cubic-bezier(.16,1,.3,1)}\n@keyframes vc-fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n\n\/* =========================================================\n   Nombramientos (Poder Digital)\n   ========================================================= *\/\n.nomb-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:12px}\n.nomb-list-grid{display:grid;grid-template-columns:1fr;gap:14px}\n@media(min-width:780px){.nomb-list-grid{grid-template-columns:1fr 1fr}}\n.nomb-item{\n  display:flex;align-items:flex-start;gap:16px;\n  padding:22px;background:#fff;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  transition:all .18s ease;\n  position:relative;\n}\n.nomb-item::before{\n  content:\"\";position:absolute;left:0;top:22px;bottom:22px;width:3px;\n  background:var(--orange);border-radius:3px;opacity:0;transition:opacity .18s ease;\n}\n.nomb-item:hover{\n  border-color:var(--navy);\n  box-shadow:0 8px 24px rgba(31,37,71,.08);\n  transform:translateY(-2px);\n}\n.nomb-item:hover::before{opacity:1}\n.nomb-item .badge{\n  flex:0 0 auto;width:48px;height:48px;border-radius:50%;\n  background:linear-gradient(135deg, var(--navy) 0%, var(--navy-light) 100%);\n  color:#fff;\n  display:flex;align-items:center;justify-content:center;\n  font-weight:700;font-size:.9rem;\n  font-family:var(--font-display);\n  box-shadow:0 4px 10px rgba(31,37,71,.18);\n}\n.nomb-item .body{flex:1;min-width:0}\n.nomb-item .name{\n  font-family:var(--font-display);\n  font-weight:700;font-size:1rem;\n  margin:0 0 6px;color:var(--navy);line-height:1.25;\n  letter-spacing:-.01em;\n}\n.nomb-item .cargo{font-size:.88rem;color:var(--ink-soft);margin:0;line-height:1.5}\n.nomb-item time{\n  font-size:.72rem;color:var(--muted);\n  display:inline-block;margin-top:10px;\n  text-transform:uppercase;letter-spacing:.06em;font-weight:600;\n}\n.nomb-item a{\n  display:inline-block;margin-top:8px;\n  color:var(--navy);text-decoration:none;\n  font-size:.78rem;font-weight:600;\n}\n.nomb-item a:hover{color:var(--orange)}\n\n\/* =========================================================\n   Leyes \/ stepper (PolicyAlert)\n   ========================================================= *\/\n.ley{\n  padding:24px 26px;margin-bottom:14px;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  background:#fff;transition:all .18s ease;\n}\n.ley:last-child{margin-bottom:0}\n.ley:hover{\n  border-color:var(--navy);\n  box-shadow:0 8px 24px rgba(31,37,71,.08);\n  transform:translateY(-2px);\n}\n.ley .ley-title{\n  font-family:var(--font-display);\n  font-weight:700;font-size:1.05rem;\n  color:var(--navy);display:block;margin-bottom:8px;\n  letter-spacing:-.015em;line-height:1.35;\n  text-decoration:none;\n}\n.ley .ley-meta{font-size:1.1rem;color:var(--ink-soft);margin:0 0 18px;line-height:1.5}\n.ley .ley-meta strong{color:var(--navy);font-weight:700}\n.stepper{display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;gap:2px 0}\n.stepper .step{\n  flex:1 1 auto;min-width:60px;text-align:center;position:relative;\n  font-size:.64rem;color:var(--muted);padding:0 4px;\n  text-transform:uppercase;letter-spacing:.04em;font-weight:600;\n}\n.stepper .step .dot{\n  width:12px;height:12px;border-radius:50%;\n  background:var(--line);border:2px solid #fff;\n  margin:0 auto 6px;position:relative;z-index:1;\n  box-shadow:0 0 0 1px var(--line);\n}\n.stepper .step.done .dot{background:var(--good);box-shadow:0 0 0 1px var(--good)}\n.stepper .step.current .dot{\n  background:var(--orange);\n  box-shadow:0 0 0 1px var(--orange), 0 0 0 4px rgba(243,165,58,.25);\n  width:14px;height:14px;\n}\n.stepper .step.done,.stepper .step.current{color:var(--ink)}\n.stepper .step.current{font-weight:700;color:var(--navy)}\n.stepper .step::before{content:\"\";position:absolute;top:5px;left:0;right:50%;height:2px;background:var(--line);z-index:0}\n.stepper .step::after{content:\"\";position:absolute;top:5px;left:50%;right:0;height:2px;background:var(--line);z-index:0}\n.stepper .step.done::before,.stepper .step.done::after{background:var(--good)}\n.stepper .step.current::before{background:var(--good)}\n.stepper .step:first-child::before{display:none}\n.stepper .step:last-child::after{display:none}\n\n\/* =========================================================\n   KPIs (PolicyAlert)\n   ========================================================= *\/\n.kpi-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin:8px 0 0}\n@media(min-width:760px){.kpi-grid{grid-template-columns:repeat(4,1fr)}}\n.kpi-card{\n  padding:24px 22px;background:#fff;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  display:flex;flex-direction:column;gap:6px;\n  position:relative;overflow:hidden;\n  transition:all .18s ease;\n}\n.kpi-card::before{\n  content:\"\";position:absolute;top:0;left:0;right:0;height:3px;\n  background:var(--navy);\n}\n.kpi-card.accent::before{background:var(--orange)}\n.kpi-card.green::before{background:var(--good)}\n.kpi-card.purple::before{background:#7C3AED}\n.kpi-card:hover{box-shadow:0 12px 28px rgba(31,37,71,.08);transform:translateY(-2px)}\n.kpi-label{\n  font-size:1.1rem;color:var(--muted);\n  text-transform:uppercase;letter-spacing:.08em;font-weight:700;margin:0;\n}\n.kpi-value{\n  font-family:var(--font-display);\n  font-size:2.4rem;font-weight:800;\n  color:var(--navy);line-height:1;margin:6px 0 2px;\n  letter-spacing:-.03em;font-variant-numeric:tabular-nums;\n}\n.kpi-card.accent .kpi-value{color:var(--orange)}\n.kpi-card.green .kpi-value{color:var(--good)}\n.kpi-card.purple .kpi-value{color:#7C3AED}\n.kpi-sub{font-size:.8rem;color:var(--ink-soft);margin:0;line-height:1.4}\n\n\/* =========================================================\n   Temas conversaci\u00f3n (WATS): filtros, leyenda, chart\n   ========================================================= *\/\n.tc-meta{\n  font-size:1.25rem;color:var(--muted);margin:8px 0 0;\n  font-weight:500;\n}\n.tc-filters{\n  display:flex;flex-wrap:wrap;gap:6px;\n  margin:20px 0 24px;\n  padding:0 0 18px;border-bottom:1px solid var(--line);\n}\n.tc-filters button{\n  border:1px solid var(--line);background:#fff;\n  color:var(--ink-soft);\n  padding:8px 16px;border-radius:999px;\n  cursor:pointer;font-size:1.1rem;font-weight:600;\n  transition:all .15s ease;line-height:1.2;\n  font-family:var(--font-display);\n}\n.tc-filters button:hover{border-color:var(--navy);color:var(--navy)}\n.tc-filters button.active{\n  background:var(--navy);color:#fff;border-color:var(--navy);\n  box-shadow:0 2px 8px rgba(31,37,71,.16);\n}\n.tc-filters button[disabled]{opacity:.35;cursor:not-allowed}\n.tc-chart-wrap{position:relative;min-height:380px;margin-bottom:16px}\n.tc-legend{\n  display:flex;flex-wrap:wrap;gap:18px;align-items:center;\n  padding:14px 18px;background:var(--bg-alt);\n  border:1px solid var(--line-soft);\n  border-radius:var(--radius-sm);\n  font-size:.8rem;color:var(--ink-soft);\n}\n.tc-legend .lg{display:inline-flex;align-items:center;gap:8px;font-weight:500}\n.tc-legend .sw{width:12px;height:12px;border-radius:3px;display:inline-block}\n\n\/* =========================================================\n   Temas activos (PolicyAlert)\n   ========================================================= *\/\n.temas-act-wrap{position:relative;height:340px;margin:14px 0 14px}\n.temas-act-summary{\n  display:flex;flex-wrap:wrap;gap:10px;align-items:center;\n  margin-bottom:14px;font-size:.88rem;color:var(--ink-soft);\n}\n.temas-act-summary .pill{\n  background:var(--orange);color:var(--navy);\n  padding:6px 14px;border-radius:999px;\n  font-weight:700;font-size:.78rem;\n  font-family:var(--font-display);letter-spacing:.01em;\n}\n.temas-act-legend{\n  display:flex;flex-wrap:wrap;gap:8px;\n  margin-top:14px;padding-top:18px;border-top:1px solid var(--line);\n}\n.temas-act-legend .ta-tag{\n  display:inline-flex;align-items:center;gap:7px;\n  padding:7px 14px;\n  border:1px solid var(--line);border-radius:999px;\n  background:#fff;cursor:pointer;\n  font-family:var(--font-display);\n  font-size:.78rem;font-weight:600;color:var(--ink);\n  transition:all .14s ease;user-select:none;line-height:1.2;\n}\n.temas-act-legend .ta-tag:hover{border-color:var(--navy)}\n.temas-act-legend .ta-tag .sw{width:10px;height:10px;border-radius:50%;display:inline-block;flex-shrink:0;border:1.5px solid transparent}\n.temas-act-legend .ta-tag.off{opacity:.45;background:var(--bg-alt);text-decoration:line-through;color:var(--muted)}\n.temas-act-legend .ta-tag.off .sw{border-color:var(--muted);background:transparent !important}\n.temas-act-legend .ta-actions{display:inline-flex;gap:8px;margin-left:auto;align-items:center;font-size:.78rem}\n.temas-act-legend .ta-actions a{color:var(--navy);font-weight:700;cursor:pointer;text-decoration:none;font-family:var(--font-display)}\n.temas-act-legend .ta-actions a:hover{color:var(--orange)}\n.temas-act-legend .ta-actions span{color:var(--muted)}\n\n\/* =========================================================\n   FAQ\n   ========================================================= *\/\n.faq-section{\n  margin:0 0 40px;padding:56px 48px;\n  background:var(--card);border:1px solid var(--line);\n  border-radius:var(--radius);box-shadow:var(--shadow);\n}\n@media(max-width:768px){.faq-section{padding:36px 24px}}\n.faq-section > h2{\n  font-family:var(--font-display);\n  font-size:clamp(1.8rem,2.6vw,2.3rem);color:var(--navy);\n  font-weight:800;margin:0 0 14px;letter-spacing:-.025em;line-height:1.1;\n  text-wrap:balance;\n}\n.faq-intro{font-size:1.05rem;color:var(--ink-soft);margin:0 0 36px;line-height:1.6;max-width:62ch}\n.faq-block{margin-bottom:36px;padding-top:32px;border-top:1px solid var(--line);scroll-margin-top:24px}\n.faq-block:first-of-type{border-top:0;padding-top:0}\n.faq-block-title{\n  font-family:var(--font-display);\n  font-size:1.35rem;color:var(--navy);\n  font-weight:800;margin:0 0 22px;letter-spacing:-.015em;\n  display:flex;align-items:center;gap:14px;flex-wrap:wrap;\n}\n.faq-badge{\n  display:inline-block;\n  background:var(--navy);color:#fff;\n  font-family:var(--font-display);\n  font-size:.68rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;\n  padding:5px 12px;border-radius:999px;\n}\n.faq-badge.brand{background:var(--orange);color:var(--navy)}\n.faq-list{display:grid;grid-template-columns:1fr;gap:10px}\n@media(min-width:1100px){.faq-list{grid-template-columns:1fr 1fr;gap:10px 24px}}\n.faq-list details{\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  background:#fff;transition:all .18s ease;overflow:hidden;\n}\n.faq-list details:hover{border-color:var(--navy-light);box-shadow:0 4px 14px rgba(31,37,71,.06)}\n.faq-list details[open]{border-color:var(--navy);box-shadow:0 8px 24px rgba(31,37,71,.10)}\n.faq-list details summary{\n  padding:16px 22px;cursor:pointer;font-weight:600;\n  color:var(--ink);font-size:1.45rem;list-style:none;line-height:1.45;\n}\n.faq-list details summary::after{\n  content:\"+\";float:right;font-weight:300;color:var(--orange);\n  font-size:1.6rem;line-height:.7;margin-left:8px;transition:transform .2s ease;\n}\n.faq-list details[open] summary::after{content:\"\\2212\";color:var(--navy)}\n.faq-list details p{padding:0 22px 18px;margin:0;font-size:.9rem;color:var(--ink-soft);line-height:1.7}\n.faq-list details p a{color:var(--navy);font-weight:700}\n\n\/* =========================================================\n   SEO block \u2014 texto largo indexable\n   ========================================================= *\/\n.seo-block{\n  margin:0 0 32px;padding:56px 48px;\n  background:var(--card);border:1px solid var(--line);\n  border-radius:var(--radius);box-shadow:var(--shadow);\n}\n@media(max-width:768px){.seo-block{padding:36px 24px}}\n.seo-block h2{\n  font-family:var(--font-display);\n  font-size:clamp(1.7rem,2.4vw,2.1rem);color:var(--navy);\n  font-weight:800;margin:0 0 32px;letter-spacing:-.025em;\n  padding-bottom:18px;border-bottom:3px solid var(--orange);\n  line-height:1.15;display:inline-block;\n}\n.seo-grid{display:grid;grid-template-columns:1fr;gap:40px;margin-top:0}\n@media(min-width:960px){.seo-grid{grid-template-columns:1fr 1fr;gap:48px}}\n.seo-item h3{\n  font-family:var(--font-display);\n  font-size:1.25rem;color:var(--navy);font-weight:800;\n  margin:0 0 14px;line-height:1.25;letter-spacing:-.015em;\n}\n.seo-item h4{\n  font-family:var(--font-display);\n  font-size:.78rem;color:var(--orange);font-weight:700;\n  margin:24px 0 12px;text-transform:uppercase;letter-spacing:.12em;\n}\n.seo-item h4::before{content:\"\/\/ \"}\n.seo-item p{font-size:1rem;color:var(--ink-soft);margin:0 0 14px;line-height:1.75}\n.seo-item p strong{color:var(--ink);font-weight:600}\n.seo-item a{color:var(--navy);font-weight:600;text-decoration:none;border-bottom:1px solid currentColor}\n.seo-item a:hover{color:var(--orange)}\n.seo-table{\n  width:100%;border-collapse:collapse;font-size:.86rem;margin-top:12px;\n  background:#fff;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden;\n}\n.seo-table caption{\n  text-align:left;padding:14px 16px;background:var(--navy);color:#fff;\n  font-family:var(--font-display);font-weight:700;font-size:1.25rem;\n  letter-spacing:-.005em;\n}\n.seo-table th,.seo-table td{padding:12px 16px;text-align:left;border-bottom:1px solid var(--line)}\n.seo-table th{\n  background:var(--bg-alt);color:var(--ink);\n  font-family:var(--font-display);font-weight:700;\n  font-size:.76rem;text-transform:uppercase;letter-spacing:.06em;\n}\n.seo-table tr:last-child td{border-bottom:0}\n.seo-table tr:nth-child(even){background:#FAFBFC}\n.seo-table .muted-cell{color:var(--muted);font-style:italic;text-align:center;padding:20px}\n\n\/* =========================================================\n   Utilidades + estados\n   ========================================================= *\/\n.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n.skeleton{background:linear-gradient(90deg,#F1F5F9 25%,#E2E8F0 50%,#F1F5F9 75%);background-size:200% 100%;animation:sk 1.4s infinite;border-radius:6px;color:transparent}\n@keyframes sk{0%{background-position:200% 0}100%{background-position:-200% 0}}\n.error{\n  background:#FEF2F2;border:1px solid #FECACA;color:#991B1B;\n  padding:14px 18px;border-radius:var(--radius-sm);font-size:.92rem;line-height:1.55;\n}\n.empty{color:var(--muted);font-size:.9rem;font-style:italic}\n\n\/* Di\u00e1logos (snippets) *\/\ndialog.snippets{border:none;border-radius:var(--radius);padding:0;max-width:560px;width:90%;box-shadow:var(--shadow-lg)}\ndialog.snippets::backdrop{background:rgba(22,26,54,.55)}\ndialog.snippets .head{padding:20px 24px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:12px}\ndialog.snippets .head h3{margin:0;font-size:1.05rem;color:var(--navy);font-family:var(--font-display);font-weight:800}\ndialog.snippets .head button{border:0;background:transparent;font-size:1.5rem;cursor:pointer;color:var(--ink-soft)}\ndialog.snippets .body{padding:20px 24px;max-height:50vh;overflow:auto}\ndialog.snippets blockquote{margin:0 0 14px;padding:14px 18px;border-left:3px solid var(--orange);background:var(--bg-alt);border-radius:6px;font-size:.92rem;color:var(--ink-soft)}\n\n\/* Heatmap (por si lo activan) *\/\n.hm-meta{display:flex;flex-wrap:wrap;gap:10px;align-items:center;font-size:.84rem;color:var(--ink-soft);margin-bottom:16px}\n.hm-meta .pill{background:var(--navy);color:#fff;padding:5px 14px;border-radius:999px;font-weight:600;font-size:.74rem;font-family:var(--font-display)}\n.hm-scroll{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;max-width:100%}\n\n\/* Hemiciclo *\/\n.hemi-wrap{position:relative;width:100%;max-width:580px;margin:0 auto}\n.hemi-wrap svg{width:100%;height:auto;display:block}\n.hemi-totals{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:16px 0 16px}\n.hemi-total{padding:14px 12px;border-radius:var(--radius-sm);background:#fff;border:1px solid var(--line);text-align:center}\n.hemi-total .lbl{font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-weight:700}\n.hemi-total .val{font-family:var(--font-display);font-size:1.4rem;font-weight:800;display:block;margin-top:4px;color:var(--navy);letter-spacing:-.02em}\n.hemi-total.yes .val{color:#16A34A}\n.hemi-total.no .val{color:#DC2626}\n.hemi-total.abs .val{color:var(--orange)}\n\n\/* Pregunta del d\u00eda *\/\n.pregunta-card{\n  padding:26px 28px;background:#fff;\n  border:1px solid var(--line);border-radius:var(--radius-sm);\n  border-top:4px solid var(--orange);\n}\n.pregunta-meta{font-size:.72rem;color:var(--muted);margin-bottom:10px;text-transform:uppercase;letter-spacing:.08em;font-weight:700;font-family:var(--font-display)}\n.pregunta-q{\n  font-family:var(--font-display);font-size:1.2rem;font-weight:800;\n  color:var(--navy);margin:0 0 14px;line-height:1.3;letter-spacing:-.015em;\n}\n.pregunta-a{font-size:1.45rem;color:var(--ink);line-height:1.7;border-left:3px solid var(--navy);padding:4px 0 4px 18px;margin-top:6px}\n\n\n\n\/* ==========================================================\n   AJUSTES UX (compact hero \u00b7 loading pill a la derecha \u00b7\n   sin aside repetido) \u2014 aplicado a todos los productos\n   ========================================================== *\/\n.vc-hero{\n  padding:42px 24px 34px !important;\n}\n.vc-hero::before{opacity:.85}\n.vc-hero-inner{\n  gap:18px;\n  align-items:center !important;\n}\n@media(min-width:880px){\n  .vc-hero-inner{\n    grid-template-columns:minmax(0,1fr) auto !important;\n    align-items:center !important;\n    gap:32px;\n  }\n}\n.vc-kicker{\n  margin:0 0 10px !important;\n  font-size:.72rem !important;\n  letter-spacing:.16em !important;\n}\n.vc-hero h1{\n  font-size:clamp(1.65rem,3.2vw,2.4rem) !important;\n  margin:0 0 10px !important;\n  line-height:1.08 !important;\n  letter-spacing:-.02em !important;\n}\n.vc-hero-lead{\n  font-size:clamp(.92rem,1.05vw,1rem) !important;\n  margin:0 !important;\n  max-width:72ch;\n  line-height:1.5 !important;\n}\n\n\/* Columna derecha: pill arriba, CTA debajo *\/\n.vc-hero-right{\n  display:flex;flex-direction:column;align-items:flex-end;gap:12px;\n}\n.vc-hero-cta{\n  padding:11px 14px 11px 22px !important;\n  font-size:.88rem !important;\n  align-self:flex-end !important;\n}\n.vc-hero-cta .ico{width:26px;height:26px;font-size:.85rem}\n\n\/* WATS no tiene logo propio: cartel \"WATS\" no clicable (en lugar del bot\u00f3n-logo) *\/\n.vc-hero-wordmark{\n  align-self:flex-end;\n  font-family:var(--font-display);\n  font-weight:800;\n  font-size:clamp(2rem,3vw,2.6rem);\n  letter-spacing:-.03em;\n  line-height:1;\n  color:#fff;\n  user-select:none;\n}\n.vc-hero-wordmark::after{\n  content:\"\";\n  display:block;\n  width:42px;height:4px;border-radius:999px;\n  margin-top:10px;\n  background:var(--orange);\n}\n@media(max-width:879px){.vc-hero-wordmark{align-self:flex-start}}\n\n\/* Loading \/ \"Actualizado\u2026\" pill \u2014 sin posici\u00f3n absoluta *\/\n.vc-hero #updated-pill{\n  position:static !important;\n  display:inline-flex;align-items:center;gap:8px;\n  background:rgba(255,255,255,.06) !important;\n  border:1px solid rgba(255,255,255,.16) !important;\n  color:rgba(255,255,255,.82) !important;\n  padding:5px 12px;border-radius:999px;\n  font-size:1.1rem;letter-spacing:.04em;\n  margin:0 !important;\n  max-width:min(80vw,360px);\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n  align-self:flex-end;\n}\n.vc-hero #updated-pill .dot{\n  width:7px;height:7px;border-radius:50%;\n  background:#4ADE80;\n  box-shadow:0 0 0 3px rgba(74,222,128,.16);\n  flex-shrink:0;\n}\n.vc-hero #updated-pill.err{\n  background:rgba(252,165,165,.08) !important;\n  border-color:rgba(252,165,165,.28) !important;\n  color:#FCA5A5 !important;\n}\n.vc-hero #updated-pill.err .dot{\n  background:#FCA5A5;\n  box-shadow:0 0 0 3px rgba(252,165,165,.18);\n}\n@media(max-width:879px){\n  .vc-hero{padding:32px 18px 26px !important;}\n  .vc-hero-right{flex-direction:row;flex-wrap:wrap;align-items:center;gap:10px;align-self:flex-start}\n  .vc-hero #updated-pill{align-self:auto}\n}\n\n\/* Quitar la aside \"product-info\" que repite los textos del hero \u00b7 grid a 1 columna *\/\n.product-grid .product-info,\n.product-grid.reverse .product-info{\n  display:none !important;\n}\n.product-grid,\n.product-grid.reverse{\n  grid-template-columns:1fr !important;\n}\n.product-grid > .product-content{\n  order:1 !important;\n  border:0 !important;\n}\n\n\/* Acercar los gr\u00e1ficos al header *\/\n.wrap{padding-top:32px !important;}\n@media(max-width:768px){.wrap{padding-top:22px !important}}\n\n\/* Asegurar que los gr\u00e1ficos aprovechan todo el ancho ahora disponible *\/\n.temas-act-wrap,\n.tc-chart-wrap{width:100% !important;}\n.temas-act-wrap canvas,\n.tc-chart-wrap canvas{\n  width:100% !important;\n  max-width:100% !important;\n}\n\n\/* ==========================================================\n   WATS \u00b7 Layout dos columnas (CTA izquierda, viz derecha)\n   ========================================================== *\/\n.wats-section{padding:0 !important;overflow:hidden}\n.wats-split{\n  display:grid;\n  grid-template-columns:1fr;\n  gap:0;\n}\n@media(min-width:980px){\n  .wats-split{grid-template-columns:380px minmax(0,1fr)}\n}\n.wats-cta{\n  background:linear-gradient(165deg,#1F2547 0%, #161A36 55%, #2A3158 100%);\n  color:#fff;\n  padding:44px 36px;\n  display:flex;flex-direction:column;gap:22px;\n  position:relative;overflow:hidden;\n}\n.wats-cta::before{\n  content:\"\";position:absolute;inset:0;pointer-events:none;\n  background:\n    radial-gradient(circle at 85% 12%, rgba(243,165,58,.18), transparent 50%),\n    radial-gradient(circle at 10% 95%, rgba(31,168,134,.14), transparent 55%);\n}\n.wats-cta > *{position:relative;z-index:1}\n.wats-cta-eyebrow{\n  color:#F3A53A;\n  font-family:var(--font-display);\n  font-weight:700;font-size:.72rem;\n  letter-spacing:.16em;text-transform:uppercase;\n}\n.wats-cta-title{\n  font-family:var(--font-display);\n  font-size:clamp(1.4rem,2.1vw,1.85rem);\n  font-weight:800;letter-spacing:-.025em;line-height:1.1;\n  margin:0;color:#fff;text-wrap:balance;\n}\n.wats-cta-lead{\n  font-size:1.45rem;line-height:1.6;margin:0;\n  color:rgba(255,255,255,.78);\n}\n.wats-cta-lead strong{color:#fff;font-weight:600}\n.wats-cta-bullets{\n  list-style:none;margin:0;padding:0;\n  display:flex;flex-direction:column;gap:12px;\n  font-size:.88rem;color:rgba(255,255,255,.82);\n  line-height:1.5;\n}\n.wats-cta-bullets li{\n  display:flex;gap:12px;align-items:flex-start;\n  padding:12px 14px;\n  background:rgba(255,255,255,.04);\n  border:1px solid rgba(255,255,255,.08);\n  border-radius:10px;\n}\n.wats-cta-bullets li strong{color:#fff;font-weight:700}\n.wats-cta-dot{\n  flex-shrink:0;width:10px;height:10px;border-radius:50%;\n  margin-top:6px;\n  box-shadow:0 0 0 3px rgba(255,255,255,.08);\n}\n.wats-cta-actions{\n  display:flex;gap:14px;align-items:center;flex-wrap:wrap;\n  margin-top:4px;\n}\n.wats-cta-btn{\n  display:inline-flex;align-items:center;gap:12px;\n  background:#fff;color:#1F2547;\n  padding:12px 14px 12px 22px;\n  border-radius:999px;\n  text-decoration:none;\n  font-family:var(--font-display);\n  font-weight:700;font-size:.88rem;\n  transition:transform .15s ease, box-shadow .2s ease;\n}\n.wats-cta-btn:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.3)}\n.wats-cta-btn .ico{\n  width:26px;height:26px;border-radius:50%;\n  background:#1F2547;color:#fff;\n  display:inline-flex;align-items:center;justify-content:center;\n  font-size:1.25rem;transition:transform .2s ease;\n}\n.wats-cta-btn:hover .ico{transform:rotate(-12deg)}\n.wats-cta-link{\n  color:rgba(255,255,255,.82);text-decoration:none;\n  font-family:var(--font-display);font-weight:600;font-size:.86rem;\n  border-bottom:1px solid rgba(255,255,255,.3);padding-bottom:2px;\n}\n.wats-cta-link:hover{color:#fff;border-color:#fff}\n.wats-cta-stats{\n  display:grid;grid-template-columns:repeat(3,1fr);gap:14px;\n  margin-top:8px;\n  padding-top:22px;\n  border-top:1px solid rgba(255,255,255,.1);\n}\n.wats-stat .num{\n  display:block;font-family:var(--font-display);\n  font-size:1.6rem;font-weight:800;color:#fff;\n  letter-spacing:-.02em;line-height:1;\n}\n.wats-stat .lbl{\n  display:block;margin-top:6px;\n  font-size:.85rem;color:rgba(255,255,255,.6);\n  text-transform:uppercase;letter-spacing:.1em;font-weight:600;\n}\n\n\/* Panel derecho: contenido (filtros + viz) *\/\n.wats-chart-panel{padding:36px 36px 36px !important}\n@media(max-width:760px){.wats-chart-panel{padding:26px 22px !important}}\n\n\/* WATS \u00b7 ocultar hero completo: todo se integra en el panel CTA izquierdo *\/\n.wats-hero-hidden{display:none !important}\n\n\/* Meta resumen dentro del panel CTA \u2014 pills compactos *\/\n.wats-cta-meta{\n  list-style:none;margin:6px 0 0;padding:18px 0 0;\n  border-top:1px solid rgba(255,255,255,.1);\n  display:flex;flex-wrap:wrap;gap:8px;\n}\n.wats-cta-meta li{\n  display:inline-flex;align-items:center;gap:8px;\n  padding:6px 11px;\n  background:rgba(255,255,255,.05);\n  border:1px solid rgba(255,255,255,.1);\n  border-radius:999px;\n  font-size:.74rem;color:rgba(255,255,255,.78);\n  font-weight:600;letter-spacing:.01em;\n  font-family:var(--font-display);\n}\n.wats-cta-meta li b{\n  color:#fff;font-weight:800;\n  font-variant-numeric:tabular-nums;\n}\n.wats-cta-meta li svg{\n  width:13px;height:13px;flex-shrink:0;\n  color:var(--orange);opacity:.95;\n}\n\n\/* Eliminar el aside product-info hu\u00e9rfano que sigue dentro de .wats-split *\/\n.wats-split .product-info{display:none !important}\n\n\/* Pill \"Actualizado\u2026\" dentro del panel CTA \u2014 estilo oscuro consistente *\/\n.wats-cta-pill{\n  display:inline-flex;align-items:center;gap:8px;\n  background:rgba(255,255,255,.06);\n  border:1px solid rgba(255,255,255,.16);\n  color:rgba(255,255,255,.82);\n  padding:6px 13px;border-radius:999px;\n  font-size:1.1rem;letter-spacing:.04em;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n  max-width:280px;\n}\n.wats-cta-pill .dot{\n  width:7px;height:7px;border-radius:50%;\n  background:#4ADE80;flex-shrink:0;\n  box-shadow:0 0 0 3px rgba(74,222,128,.16);\n}\n.wats-cta-pill.err{\n  background:rgba(252,165,165,.08);\n  border-color:rgba(252,165,165,.28);\n  color:#FCA5A5;\n}\n.wats-cta-pill.err .dot{background:#FCA5A5;box-shadow:0 0 0 3px rgba(252,165,165,.18)}\n\n\/* Quitar header repetitivo del panel derecho *\/\n.wats-chart-panel .product-content-header{display:none !important}\n.wats-chart-panel .tc-filters{margin-top:0 !important}\n\n\/* Lista de temas (sustituye al canvas) *\/\n.tc-chart-wrap{\n  position:relative;\n  height:auto !important;\n  min-height:0 !important;\n  max-height:560px;\n  overflow-y:auto;overflow-x:hidden;\n  padding:4px 6px 4px 0;\n  margin:0 0 14px;\n  scrollbar-width:thin;\n  scrollbar-color:#cfd4df transparent;\n}\n.tc-chart-wrap::-webkit-scrollbar{width:8px}\n.tc-chart-wrap::-webkit-scrollbar-thumb{background:#cfd4df;border-radius:8px}\n.tc-chart-wrap canvas{display:none !important}\n.tc-topics-list{display:flex;flex-direction:column;gap:8px}\n.tc-topic{\n  display:grid;\n  grid-template-columns:auto minmax(0,1fr) auto;\n  align-items:center;gap:14px;\n  padding:10px 14px;\n  background:#fff;\n  border:1px solid var(--line);\n  border-left:4px solid var(--c, #6B7280);\n  border-radius:8px;\n  transition:transform .15s ease, box-shadow .2s ease, border-color .15s;\n  cursor:default;\n}\n.tc-topic:hover{\n  transform:translateX(2px);\n  box-shadow:0 6px 18px rgba(31,37,71,.08);\n  border-color:var(--c, #6B7280);\n}\n.tc-topic .tc-rank{\n  font-family:var(--font-display);font-variant-numeric:tabular-nums;\n  font-size:.78rem;font-weight:700;\n  color:var(--muted);\n  width:24px;text-align:center;\n}\n.tc-topic .tc-body{min-width:0;display:flex;flex-direction:column;gap:5px}\n.tc-topic .tc-topic-name{\n  font-weight:600;color:var(--ink);\n  font-size:.92rem;line-height:1.35;\n  text-overflow:ellipsis;overflow:hidden;\n  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;\n}\n.tc-topic .tc-bar{\n  position:relative;height:6px;\n  background:rgba(0,0,0,.05);border-radius:999px;overflow:hidden;\n  margin-top:2px;\n}\n.tc-topic .tc-bar .tc-fill{\n  display:block;height:100%;border-radius:999px;\n  background:var(--c, #6B7280);\n  transition:width .8s cubic-bezier(.2,.7,.2,1);\n}\n.tc-topic .tc-meta-line{\n  display:flex;gap:10px;align-items:center;flex-wrap:wrap;\n  font-size:1.1rem;color:var(--muted);\n  text-transform:uppercase;letter-spacing:.06em;font-weight:600;\n}\n.tc-topic .tc-meta-line .tc-ambito{\n  display:inline-flex;align-items:center;gap:5px;\n  color:var(--ink-soft);\n}\n.tc-topic .tc-meta-line .tc-ambito::before{\n  content:\"\";width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.5;\n}\n.tc-topic .tc-sentiment{\n  font-size:.85rem;font-weight:800;letter-spacing:.08em;\n  text-transform:uppercase;\n  padding:3px 9px;border-radius:999px;\n  background:var(--c, #6B7280);color:#fff;\n  white-space:nowrap;\n}\n.tc-topic .tc-freq{\n  font-family:var(--font-display);font-variant-numeric:tabular-nums;\n  font-size:1.25rem;font-weight:800;\n  color:var(--c, #1F2547);\n  line-height:1;\n  display:flex;flex-direction:column;align-items:flex-end;\n  min-width:42px;\n}\n.tc-topic .tc-freq small{\n  font-size:.55rem;color:var(--muted);\n  text-transform:uppercase;letter-spacing:.1em;font-weight:600;\n  margin-top:3px;line-height:1;\n}\n@media(max-width:560px){\n  .tc-topic{grid-template-columns:auto 1fr auto;gap:10px;padding:10px 12px}\n  .tc-topic .tc-rank{display:none}\n  .tc-topic .tc-topic-name{font-size:.88rem}\n}\n\n\/* ==========================================================\n   WATS \u00b7 Treemap de tendencias (temas de conversaci\u00f3n) \u2014 Vinces\n   Namespaced bajo .wt-tree\n   ========================================================== *\/\n.wt-tree{--blue:var(--navy);--fd:var(--font-display);--fb:var(--font-body);--fm:ui-monospace,Menlo,monospace}\n.wt-tree .wt-hint{font-size:.92rem;color:var(--ink-soft);margin:0 0 18px;max-width:72ch;line-height:1.55}\n.wt-tree .wt-hint strong{color:var(--ink);font-weight:700}\n.wt-tree .filterbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 4px}\n.wt-tree .flabel{font-family:var(--fm);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-right:2px;min-width:88px;display:inline-block}\n.wt-tree .schip{display:inline-flex;align-items:center;gap:8px;font-family:var(--fb);font-weight:600;font-size:13px;border:1.5px solid var(--line);background:#fff;border-radius:999px;padding:7px 15px;cursor:pointer;transition:all .14s;color:var(--ink);white-space:nowrap}\n.wt-tree .filterbar .period-pill{display:none}\n.product-content-header .period-tag{display:inline-flex;align-items:center;gap:7px;align-self:flex-start;margin-top:5px;font-family:var(--fb);font-weight:500;font-size:13px;color:var(--muted);white-space:nowrap}\n.product-content-header .period-tag svg{width:15px;height:15px;color:var(--muted);flex:none}\n.product-content-header .period-tag b{color:var(--ink);font-weight:700}\n@media(max-width:620px){.product-content-header .period-tag{align-self:flex-start;margin-top:4px}}\n.wt-tree .schip .cdot{width:11px;height:11px;border-radius:50%}\n.wt-tree .metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:26px 0 0}\n@media(max-width:980px){.wt-tree .metrics{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:520px){.wt-tree .metrics{grid-template-columns:repeat(1,1fr)}}\n.wt-tree .metric{background:var(--bg-alt);border-radius:14px;padding:14px 16px;text-align:center}\n.wt-tree .metric .k{font-family:var(--fm);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 8px}\n.wt-tree .metric .v{font-family:var(--fd);font-weight:800;font-size:24px;line-height:1.05;color:var(--blue)}\n.wt-tree .metric .v small{font-family:var(--fb);font-weight:500;font-size:12px;color:var(--ink-soft);display:block;margin-top:6px;letter-spacing:0;text-transform:none;line-height:1.35}\n.wt-tree .metric .split{margin-top:4px}\n.wt-tree .metric .split-bar{display:flex;height:11px;border-radius:999px;overflow:hidden;background:var(--line)}\n.wt-tree .metric .split-bar span{display:block;height:100%;transition:filter .15s}\n.wt-tree .metric .split-bar .seg{cursor:default}\n.wt-tree .metric .split-bar .seg.hot{filter:brightness(1.16)}\n.wt-tree .metric .split-legend span{transition:color .15s,transform .15s;cursor:default}\n.wt-tree .metric .split-legend span b{display:none;font-weight:700;color:var(--ink);margin-left:3px;transition:color .15s}\n.wt-tree .metric .split-legend span.hot b{display:inline-block;color:var(--ink);font-weight:600;font-size:12px}\n.wt-tree .metric .split-legend span.hot i{transform:scale(1.3)}\n.wt-tree .metric .split-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:5px 14px;margin-top:9px;font-family:var(--fb);font-weight:500;font-size:12px;color:var(--ink-soft);letter-spacing:0;text-transform:none;line-height:1.2}\n.wt-tree .metric .split-legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:middle}\n.wt-tree .top-ents{margin:18px 0 0;background:var(--bg-alt);border-radius:14px;padding:14px 16px}\n.wt-tree .top-ents .k{font-family:var(--fm);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 10px}\n.wt-tree .top-ents .k .mock{text-transform:none;letter-spacing:0;color:var(--ink-soft);font-family:var(--fb);font-weight:500}\n.wt-tree .top-ents ol{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px}\n.wt-tree .top-ents li{display:flex;align-items:center;gap:9px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 14px 6px 8px}\n.wt-tree .top-ents .ent{display:flex;flex-direction:column;line-height:1.15;min-width:0;max-width:210px}\n.wt-tree .top-ents .nm{font-family:var(--fb);font-weight:600;font-size:13px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:210px}\n.wt-tree .top-ents .role{font-family:var(--fb);font-weight:500;font-size:11px;color:var(--ink-soft);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:210px}\n.wt-tree .top-ents .rk{width:20px;height:20px;border-radius:50%;background:var(--blue);color:#fff;font-family:var(--fd);font-weight:800;font-size:11px;display:grid;place-items:center;flex:none}\n.wt-tree .top-ents .nm{font-family:var(--fb);font-weight:600;font-size:13px;color:var(--ink)}\n.wt-tree .top-ents .ct{font-family:var(--fm);font-size:12px;color:var(--ink-soft)}\n.wt-tree .top-ents li.ent-row{cursor:pointer;transition:border-color .14s,box-shadow .14s,transform .14s}\n.wt-tree .top-ents li.ent-row:hover{border-color:var(--blue);box-shadow:0 4px 14px rgba(31,37,71,.1);transform:translateY(-1px)}\n.wt-tree .top-ents li.ent-row:focus-visible{outline:2px solid var(--blue);outline-offset:2px}\n.wt-tree .top-ents .nm-orig-removed{}\n.wt-tree .metric .crit{display:flex;align-items:center;justify-content:center;gap:9px}\n\/* CTA banner siempre visible bajo el gr\u00e1fico \u2014 abre el modal de contacto *\/\n.wt-tree .wt-cta-bar{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;margin:22px 0 0;padding:20px 24px;border-radius:16px;background:linear-gradient(135deg,#1F2547 0%,#161A36 60%,#2A3158 100%);position:relative;overflow:hidden}\n.wt-tree .wt-cta-bar::before{content:\"\";position:absolute;inset:0;pointer-events:none;background:radial-gradient(circle at 90% 10%,rgba(243,165,58,.18),transparent 55%)}\n.wt-tree .wt-cta-txt{position:relative;z-index:1;color:rgba(255,255,255,.82);font-family:var(--fb);font-size:1.45rem;line-height:1.5;max-width:62ch}\n.wt-tree .wt-cta-txt strong{color:#fff;font-weight:700}\n.wt-tree .wt-cta-btn{position:relative;z-index:1;flex-shrink:0;display:inline-flex;align-items:center;gap:10px;border:0;cursor:pointer;background:var(--orange);color:var(--navy);font-family:var(--fd);font-weight:700;font-size:.92rem;padding:12px 24px;border-radius:999px;transition:transform .15s ease,box-shadow .2s ease,background .2s ease;box-shadow:0 6px 18px rgba(243,165,58,.28)}\n.wt-tree .wt-cta-btn:hover{transform:translateY(-1px);background:#f7b35a;box-shadow:0 10px 24px rgba(243,165,58,.4)}\n.wt-tree .wt-cta-btn .arr{transition:transform .18s ease}\n.wt-tree .wt-cta-btn:hover .arr{transform:translateX(3px)}\n@media(max-width:620px){.wt-tree .wt-cta-bar{flex-direction:column;align-items:flex-start}.wt-tree .wt-cta-btn{width:100%;justify-content:center}}\n.wt-tree .metric .climate{display:flex;flex-direction:column;gap:11px;margin-top:2px}\n.wt-tree .metric .climate-one{display:flex;flex-direction:column;align-items:center;gap:5px;margin-top:4px}\n.wt-tree .metric .climate-one .cl-top{display:flex;align-items:center;justify-content:center;gap:8px}\n.wt-tree .metric .climate-one .cl-ic{display:inline-flex;width:22px;height:22px;color:var(--navy)}\n.wt-tree .metric .climate-one .cl-ic svg{width:22px;height:22px;display:block}\n.wt-tree .metric .climate-one .cl-nm{font-family:var(--fd);font-weight:700;font-size:14px;color:var(--ink);line-height:1.15}\n.wt-tree .metric .climate-one .cl-pct{font-family:var(--fd);font-weight:600;font-size:15px;line-height:1}\n.wt-tree .metric .climate-one .cl-pct.pos{color:#3F875C}\n.wt-tree .metric .climate-one .cl-pct.neg{color:#C2564A}\n.wt-tree .metric .crit-ic{display:inline-flex;width:26px;height:26px;flex:none}\n.wt-tree .metric .crit-ic svg{width:26px;height:26px;display:block}\n.wt-modal{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(22,26,54,.55);opacity:0;visibility:hidden;transition:opacity .18s}\n.wt-modal.open{opacity:1;visibility:visible}\n.wt-modal .box{background:#fff;border-radius:18px;max-width:380px;width:100%;padding:28px;box-shadow:0 24px 60px rgba(31,37,71,.32);text-align:center;transform:translateY(10px);transition:transform .18s;font-family:var(--font-body)}\n.wt-modal.open .box{transform:none}\n.wt-modal h4{font-family:var(--font-display);font-weight:800;font-size:1.2rem;color:var(--navy);margin:0 0 8px}\n.wt-modal p{color:var(--ink-soft);font-size:1.45rem;line-height:1.55;margin:0 0 20px}\n.wt-modal .acts{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}\n.wt-modal a.cta{background:var(--navy);color:#fff;text-decoration:none;font-family:var(--font-display);font-weight:700;font-size:.9rem;padding:11px 20px;border-radius:10px}\n.wt-modal button.x{background:var(--bg-alt);border:1px solid var(--line);color:var(--ink);font-family:var(--font-display);font-weight:700;font-size:.9rem;padding:11px 18px;border-radius:10px;cursor:pointer}\n.wt-tree .tchips{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:20px 0 0}\n.wt-tree .tchip{font-family:var(--fb);font-weight:600;font-size:13px;border-radius:999px;padding:7px 16px;cursor:pointer;border:1.5px solid;background:#fff;transition:all .14s;white-space:nowrap}\n.wt-tree .tchip.on{box-shadow:0 0 0 3px rgba(0,0,0,.06)}\n.wt-tree .scope{font-family:var(--fm);font-size:12px;color:var(--muted);margin:22px 0 0}\n.wt-tree .intro{font-size:15px;color:var(--ink-soft);margin:8px 0 0;max-width:74ch}\n.wt-tree .treebox{position:relative}\n.wt-tree #canvas{position:relative;width:100%;height:520px;margin-top:14px}\n.wt-tree .box{position:absolute;border-radius:10px;overflow:hidden;padding:12px 14px;display:flex;flex-direction:column;cursor:pointer;transition:transform .14s cubic-bezier(.2,.8,.2,1),filter .14s ease}\n.wt-tree .box:hover{filter:brightness(.95);transform:translateY(-2px)}\n.wt-tree .box .lbl{font-family:var(--fd);font-weight:700;line-height:1.13;letter-spacing:-.01em}\n.wt-tree .box .num{font-family:var(--fm);font-size:11.5px;margin-top:6px;opacity:.9}\n.wt-tree .wt-empty{color:var(--muted);font-family:var(--fm);padding:32px 0;text-align:center}\n.wt-tree .pos .phead{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:6px 0 0}\n.wt-tree .pos .phead .back{margin-top:0;flex:none}\n.wt-tree .pos .ptitle{font-family:var(--fd);font-weight:800;font-size:clamp(20px,3vw,28px);letter-spacing:-.015em;color:var(--ink);margin:0;line-height:1.2}\n.wt-tree .pos .pcrumb{font-family:var(--fm);font-size:12px;color:var(--muted);margin:10px 0 0}\n.wt-tree .ptags{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:12px}\n.wt-tree .ptag{display:inline-flex;align-items:center;gap:7px;font-family:var(--fm);font-size:12px;padding:5px 13px;border-radius:999px}\n.wt-tree .sentdot{width:10px;height:10px;border-radius:50%}\n.wt-tree .psummary{font-size:16px;color:var(--ink);max-width:74ch;margin:16px 0 0;line-height:1.65}\n.wt-tree .pmeta{font-family:var(--fm);font-size:13px;color:var(--ink-soft);margin:14px 0 2px}\n.wt-tree .pgroup{border:1px solid var(--line);border-radius:14px;padding:18px 20px;margin-top:14px}\n.wt-tree .pgroup h3{font-family:var(--fd);font-size:15px;margin:0;display:flex;align-items:center;gap:9px}\n.wt-tree .pgroup h3 .gd{width:12px;height:12px;border-radius:50%}\n.wt-tree .pstance{font-size:15px;color:var(--ink);margin:8px 0 14px;line-height:1.6;max-width:74ch}\n.wt-tree .orgs{display:flex;gap:8px;flex-wrap:wrap}\n.wt-tree .org{font-family:var(--fm);font-size:12px;color:var(--ink-soft);background:var(--bg-alt);border:1px solid var(--line);padding:5px 11px;border-radius:8px}\n.wt-tree .tops{display:flex;flex-direction:column;gap:10px;margin-top:12px;max-width:74ch}\n.wt-tree .pos .pos-grid{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:start;margin-top:22px}\n@media(max-width:880px){.wt-tree .pos .pos-grid{grid-template-columns:1fr;gap:22px}}\n.wt-tree .pos .pdesc{display:grid;grid-template-columns:1.5fr 1fr;background:var(--bg-alt);border:1px solid var(--line);border-radius:14px;padding:0;margin:18px 0 0;overflow:hidden}\n@media(max-width:760px){.wt-tree .pos .pdesc{grid-template-columns:1fr}}\n.wt-tree .pos .pdesc .pdesc-col{padding:18px 20px}\n.wt-tree .pos .pdesc .pdesc-col + .pdesc-col{border-left:1px solid var(--line)}\n@media(max-width:760px){.wt-tree .pos .pdesc .pdesc-col + .pdesc-col{border-left:0;border-top:1px solid var(--line)}}\n.wt-tree .pos .pdesc .pdesc-h{font-family:var(--fd);font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin:0 0 8px}\n.wt-tree .pos .pdesc .psummary{margin:0;max-width:none}\n.wt-tree .pos .pdesc .pconcepts{margin:0;border-top:0;padding-top:18px}\n.wt-tree .pos .pdesc .pconcepts-h{display:block;font-family:var(--fm);font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 9px}\n.wt-tree .pos .pdesc .pconcepts-row{display:flex;flex-wrap:wrap;gap:8px}\n.wt-tree .pos .pdesc .pconcept{font-family:var(--fb);font-weight:600;font-size:12.5px;color:var(--navy);background:#fff;border:1px solid var(--line);border-radius:999px;padding:5px 13px;cursor:pointer;transition:border-color .14s,background .14s}\n.wt-tree .pos .pdesc .pconcept:hover{border-color:var(--navy);background:var(--navy-soft)}\n.wt-tree .pos .col-h{font-family:var(--fd);font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin:0 0 14px}\n.wt-tree .pos-left .pgroup{border:1px solid var(--line);border-left:4px solid var(--gc,var(--navy));background:#fff;border-radius:12px;padding:16px 18px;margin:0 0 14px;box-shadow:0 1px 2px rgba(31,37,71,.04)}\n.wt-tree .pos-left .pgroup:last-child{margin-bottom:0}\n.wt-tree .pos-right .tops{max-width:none;margin-top:0}\n.wt-tree .pos-right .top{min-height:120px;height:auto;overflow:hidden;background:var(--bg-alt);border:1px solid var(--line);border-radius:12px;padding:12px 15px;cursor:default}\n.wt-tree .pos-right .top .top-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:6px}\n.wt-tree .pos-right .ver-mas{margin-top:14px;width:100%;background:#fff;border:1.5px solid var(--line);border-radius:10px;padding:11px;font-family:var(--fd);font-weight:700;font-size:.9rem;color:var(--navy);cursor:pointer;transition:border-color .14s,background .14s}\n.wt-tree .pos-right .ver-mas:hover{border-color:var(--navy);background:var(--bg-alt)}\n.wt-tree .top-head .top-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex:none}\n.wt-tree .top{border:1px solid var(--line);border-radius:12px;padding:12px 15px;background:var(--bg-alt)}\n.wt-tree .top-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:13.5px}\n.wt-tree .top-head>strong{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}\n.wt-tree .top-head strong{font-weight:600}\n.wt-tree .top-net{font-family:var(--fm);font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;display:inline-flex;align-items:center}\n.wt-tree .top-net svg{width:15px;height:15px;display:block}\n.wt-tree .top-role{font-family:var(--fb);font-size:11.5px;font-weight:600;color:var(--ink-soft);background:var(--bg-alt);border:1px solid var(--line);border-radius:999px;padding:1px 9px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.wt-tree .top-impact{font-family:var(--fm);font-size:12px;color:var(--blue);font-weight:700}\n.wt-tree .top-link{margin-left:auto;font-weight:600;font-size:12.5px;color:var(--blue);text-decoration:none;border:1px solid var(--line);border-radius:7px;padding:3px 9px}\n.wt-tree .top-text{font-size:14px;color:var(--ink);margin-top:8px;line-height:1.5}\n.wt-tree .back{display:inline-flex;align-items:center;gap:8px;margin-top:14px;font-family:var(--fb);font-weight:600;font-size:14px;color:var(--blue);background:none;border:1.5px solid var(--blue);border-radius:10px;padding:8px 16px;cursor:pointer}\n.wt-tree .back:hover{background:var(--blue);color:#fff}\n@media(max-width:720px){.wt-tree #canvas{height:560px}}\n\n\/* ==========================================================\n   HERO IMPACTO \u2014 titular grande, LIVE pulsante, malla + glow,\n   chips de alcance. Sobrescribe los ajustes \"compact\".\n   ========================================================== *\/\n.vc-hero{\n  padding:46px 24px 40px !important;\n  background:\n    radial-gradient(120% 140% at 85% -10%, var(--navy-light) 0%, var(--navy) 42%, var(--navy-deep) 100%) !important;\n}\n\/* Malla de puntos sutil sobre el navy *\/\n.vc-hero::before{\n  background:\n    radial-gradient(circle at 88% 12%, rgba(243,165,58,.16), transparent 42%),\n    radial-gradient(circle at 4% 100%, rgba(31,168,134,.10), transparent 52%),\n    radial-gradient(rgba(255,255,255,.05) 1px, transparent 1px) !important;\n  background-size:auto, auto, 22px 22px !important;\n  opacity:1 !important;\n}\n.vc-hero::after{\n  height:2px !important;\n  background:linear-gradient(90deg, transparent, var(--orange), transparent) !important;\n  opacity:.6;\n}\n.vc-hero-inner{\n  align-items:center !important;\n  gap:28px !important;\n}\n@media(min-width:880px){\n  .vc-hero-inner{\n    grid-template-columns:minmax(0,1fr) auto !important;\n    align-items:center !important;\n    gap:56px !important;\n  }\n}\n\n\/* Kicker con punto LIVE pulsante *\/\n.vc-kicker{\n  display:inline-flex !important;align-items:center;gap:9px;\n  margin:0 0 13px !important;\n  font-size:.72rem !important;\n  letter-spacing:.18em !important;\n  padding:6px 14px 6px 11px;\n  border:1px solid rgba(243,165,58,.32);\n  border-radius:999px;\n  background:rgba(243,165,58,.08);\n  color:var(--orange);\n}\n.vc-kicker::before{content:none !important}\n.vc-live-dot{\n  position:relative;width:8px;height:8px;border-radius:50%;\n  background:#4ADE80;flex-shrink:0;\n}\n.vc-live-dot::after{\n  content:\"\";position:absolute;inset:0;border-radius:50%;\n  background:#4ADE80;\n}\n@media(prefers-reduced-motion:no-preference){\n  .vc-live-dot::after{animation:vcLivePulse 1.8s ease-out infinite}\n}\n@keyframes vcLivePulse{\n  0%{transform:scale(1);opacity:.7}\n  70%{transform:scale(3);opacity:0}\n  100%{transform:scale(3);opacity:0}\n}\n\n\/* Titular grande con segunda l\u00ednea destacada *\/\n.vc-hero h1{\n  font-size:clamp(1.7rem,3.3vw,2.7rem) !important;\n  font-weight:800 !important;\n  line-height:1 !important;\n  letter-spacing:-.035em !important;\n  margin:0 0 14px !important;\n  white-space:nowrap;\n}\n.vc-hero h1 .hl{\n  position:relative;\n  color:var(--orange);\n  white-space:nowrap;\n}\n.vc-hero h1 .hl::after{\n  content:\"\";position:absolute;left:0;right:0;bottom:.04em;height:.09em;\n  background:linear-gradient(90deg,var(--orange),rgba(243,165,58,.15));\n  border-radius:999px;\n}\n\n.vc-hero-lead{\n  font-size:clamp(.9rem,1vw,1.02rem) !important;\n  color:rgba(255,255,255,.82) !important;\n  max-width:60ch !important;\n  line-height:1.58 !important;\n  margin:0 0 20px !important;\n}\n\n\/* Fila de chips de alcance *\/\n.vc-hero-chips{\n  display:flex;flex-wrap:wrap;gap:10px;margin:0;padding:0;list-style:none;\n}\n.vc-hero-chips li{\n  display:inline-flex;align-items:center;gap:8px;\n  font-family:var(--font-display);\n  font-size:1.1rem;font-weight:600;\n  color:rgba(255,255,255,.9);\n  background:rgba(255,255,255,.06);\n  border:1px solid rgba(255,255,255,.14);\n  padding:8px 14px;border-radius:999px;\n  backdrop-filter:blur(6px);\n  transition:transform .15s ease, border-color .15s ease, background .15s ease;\n}\n.vc-hero-chips li:hover{\n  transform:translateY(-2px);\n  border-color:rgba(243,165,58,.4);\n  background:rgba(243,165,58,.1);\n}\n.vc-hero-chips .chip-ico{\n  color:var(--orange);display:inline-flex;flex-shrink:0;\n}\n@media(prefers-reduced-motion:reduce){\n  .vc-hero-chips li:hover{transform:none}\n}\n\n\/* CTA m\u00e1s presente *\/\n.vc-hero-cta{\n  padding:14px 18px 14px 26px !important;\n  font-size:.95rem !important;\n  box-shadow:0 8px 24px rgba(0,0,0,.22);\n}\n.vc-hero-cta .ico{width:30px;height:30px;font-size:.95rem}\n\n@media(max-width:879px){\n  .vc-hero{padding:44px 18px 36px !important;}\n  .vc-hero h1{font-size:clamp(1.7rem,7vw,2.6rem) !important;white-space:normal}\n  .vc-hero h1 .hl{white-space:normal}\n}\n\n\/* ==========================================================\n   RUEDA VERTICAL (estilo cr\u00e9ditos) \u2014 rail derecho del hero\n   ========================================================== *\/\n\/* Rail: pill arriba, tarjeta de la rueda en medio, CTA abajo *\/\n.vc-hero-right{\n  gap:18px !important;\n  align-self:center !important;\n}\n\/* Tarjeta que enmarca la rueda *\/\n.vc-hero-rail-card{\n  width:286px;\n  background:rgba(255,255,255,.045);\n  border:1px solid rgba(255,255,255,.12);\n  border-radius:16px;\n  padding:16px 16px 8px;\n  backdrop-filter:blur(6px);\n}\n.vc-wheel-label{\n  display:block;\n  font-family:var(--font-display);\n  font-size:.85rem;font-weight:700;\n  letter-spacing:.18em;text-transform:uppercase;\n  color:var(--orange);\n  margin:0 0 12px 2px;\n}\n.vc-hero-wheel{\n  position:relative;\n  height:184px;\n  overflow:hidden;\n  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 20%,#000 80%,transparent 100%);\n  mask-image:linear-gradient(180deg,transparent 0,#000 18%,#000 82%,transparent 100%);\n}\n.vc-hero-wheel-track{\n  display:flex;flex-direction:column;\n  will-change:transform;\n}\n@media(prefers-reduced-motion:no-preference){\n  .vc-hero-wheel-track{animation:vcWheelScroll 16s linear infinite}\n}\n.vc-hero-wheel:hover .vc-hero-wheel-track{animation-play-state:paused}\n@keyframes vcWheelScroll{\n  from{transform:translateY(0)}\n  to{transform:translateY(-50%)}\n}\n.vc-wheel-chip{\n  display:flex;align-items:center;gap:10px;\n  margin-bottom:10px;\n  font-family:var(--font-display);\n  font-size:1.1rem;font-weight:600;line-height:1.25;\n  color:rgba(255,255,255,.92);\n  background:rgba(255,255,255,.06);\n  border:1px solid rgba(255,255,255,.14);\n  padding:10px 14px;border-radius:12px;\n  backdrop-filter:blur(6px);\n}\n.vc-wheel-chip .chip-ico{\n  color:var(--orange);display:inline-flex;flex-shrink:0;\n}\n\/* Acciones bajo el texto: bot\u00f3n-logo + badge \"Actualizado\" *\/\n.vc-hero-actions{\n  display:flex;align-items:center;flex-wrap:wrap;\n  gap:16px;margin-top:22px;\n}\n.vc-hero-actions .vc-hero-cta{align-self:auto !important}\n.vc-hero-actions #updated-pill{align-self:auto !important}\n.vc-hero .period-pill{\n  display:inline-flex;align-items:center;gap:9px;align-self:auto;\n  font-family:var(--font-display);font-weight:700;font-size:.9rem;\n  color:#fff;background:rgba(243,165,58,.14);\n  border:1px solid rgba(243,165,58,.55);border-radius:999px;\n  padding:9px 16px;line-height:1;\n}\n.vc-hero .period-pill svg{width:17px;height:17px;color:var(--orange);flex:none}\n.vc-hero .period-pill b{color:var(--orange);font-weight:800}\n\n\/* Bot\u00f3n = logotipo completo de PolicyAlert (sin texto) *\/\n.vc-hero-cta{\n  padding:10px 18px !important;\n  gap:10px !important;\n}\n.vc-cta-logo{display:inline-flex;align-items:center;flex-shrink:0}\n.vc-cta-logo svg{height:30px;width:auto;display:block}\n\/* Icono \"abrir en nueva ventana\": badge circular navy \u2192 se\u00f1ala que es un enlace *\/\n.vc-cta-ext{\n  width:26px;height:26px;border-radius:50%;flex-shrink:0;\n  background:var(--navy);color:#fff;\n  display:inline-flex;align-items:center;justify-content:center;\n  transition:transform .15s ease, background .2s ease;\n}\n.vc-cta-ext svg{width:14px;height:14px;display:block}\n.vc-hero-cta:hover .vc-cta-ext{background:var(--navy-light);transform:translate(1px,-1px)}\n\n@media(max-width:879px){\n  .vc-hero-rail-card{width:100%}\n  .vc-hero-wheel{height:148px}\n  .vc-cta-logo svg{height:30px}\n}\n\n\/* Logo de producto (imagotipo) en el CTA *\/\n.vc-cta-logo svg, .vc-cta-logo img{height:40px !important;width:auto;display:block}\n\n<\/style>\n\n<style id=\"rubrika-type\">\n\/* === Sistema tipogr\u00e1fico Rubrika + hero padding (jun 2026) ===\n   T\u00edtulos\/Subt\u00edtulos: Libre Franklin \u00b7 Textos\/Botones: Lato *\/\n.vc-hero{ padding:150px 24px 100px !important; }\n@media(max-width:879px){ .vc-hero{ padding:110px 18px 64px !important; } }\n\/* T\u00edtulos \u2014 Libre Franklin 600 \u00b7 48\/58 *\/\n.vc-hero h1{\n  font-family:\"Libre Franklin\",sans-serif !important;\n  font-weight:600 !important; font-size:48px !important;\n  line-height:58px !important; letter-spacing:-.01em !important;\n  white-space:normal !important;\n}\n@media(max-width:879px){ .vc-hero h1{ font-size:34px !important; line-height:42px !important; } }\n\/* Subt\u00edtulos \u2014 Libre Franklin 600 \u00b7 32\/38 *\/\n.product-name, .product-content-header h3, .faq-section > h2, .seo-block h2{\n  font-family:\"Libre Franklin\",sans-serif !important;\n  font-weight:600 !important; font-size:32px !important;\n  line-height:38px !important; letter-spacing:-.01em !important;\n}\n@media(max-width:879px){\n  .product-name, .product-content-header h3, .faq-section > h2, .seo-block h2{\n    font-size:25px !important; line-height:31px !important;\n  }\n}\n\/* Textos \u2014 Lato 400 \u00b7 16\/24 *\/\n.vc-hero-lead, .product-content-header .sub, .faq-intro,\n.faq-list details p, .pane-cta-text, .seo-item p{\n  font-family:\"Lato\",sans-serif !important;\n  font-weight:400 !important; font-size:16px !important; line-height:24px !important;\n}\n\/* Botones \u2014 Lato 700 \u00b7 15\/15 *\/\n.vc-hero-cta, .vc-hero-contact, .pane-cta, .vc-cmodal .cta,\n.wt-cta-btn, .saber-mas, .ley-follow{\n  font-family:\"Lato\",sans-serif !important;\n  font-weight:700 !important; font-size:15px !important; line-height:15px !important;\n}\n<\/style>\n<\/head>\n<body>\n\n<!-- HERO oculto en WATS \u00b7 todo el contenido se integra en el panel CTA izquierdo -->\n<section class=\"vc-hero\" aria-label=\"Cabecera de producto\" data-vc-hero-injected=\"1\">\n  <div class=\"vc-hero-inner\">\n    <div>\n      <span class=\"vc-kicker\"><span class=\"vc-live-dot\"><\/span>WATS \u00b7 Social intelligence<\/span>\n      <h1>What are <span class=\"hl\">the people who matter to you<\/span> saying?<\/h1>\n      <p class=\"vc-hero-lead\"><strong>WATS<\/strong> answers What Are They Saying?: what associations, opinion leaders, decision-makers and other key actors say about the topics that concern you. It analyses public conversation on social media and in the press to identify positions and trends.<\/p>\n      <div class=\"vc-hero-actions\">\n        <div class=\"vc-hero-wordmark\" role=\"img\" aria-label=\"WATS\">WATS<\/div>\n        <span class=\"updated\" id=\"updated-pill\" aria-live=\"polite\" style=\"background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14);color:rgba(255,255,255,.85)\">\n          <span class=\"dot\"><\/span>\n          <span id=\"updated-text\">Loading data\u2026<\/span>\n        <\/span>\n      <\/div>\n    <\/div>\n    <div class=\"vc-hero-rail-card\" id=\"vc-hero-wheel\" role=\"group\" aria-label=\"What WATS analyses\">\n      <span class=\"vc-wheel-label\">What we analyse<\/span>\n      <div class=\"vc-hero-wheel\">\n        <div class=\"vc-hero-wheel-track\">\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"\/><circle cx=\"6\" cy=\"12\" r=\"3\"\/><circle cx=\"18\" cy=\"19\" r=\"3\"\/><path d=\"M8.6 13.5l6.8 4M15.4 6.5l-6.8 4\"\/><\/svg><\/span>X, Instagram, TikTok &amp; LinkedIn<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\/><\/svg><\/span>Narratives &amp; messages<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8z\"\/><\/svg><\/span>Positive &amp; negative sentiment<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.6 13.4l-7.2 7.2a2 2 0 0 1-2.8 0L2 12V2h10l8.6 8.6a2 2 0 0 1 0 2.8z\"\/><circle cx=\"7\" cy=\"7\" r=\"1.5\"\/><\/svg><\/span>Topics &amp; sectors<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg><\/span>Political decision-makers<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><path d=\"M9 21V9h6v12M9 9V3M15 9V3\"\/><\/svg><\/span>Associations &amp; agents<\/span>\n          <span class=\"vc-wheel-chip\"><span class=\"chip-ico\" aria-hidden=\"true\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"\/><polyline points=\"17 6 23 6 23 12\"\/><\/svg><\/span>Conversation trends<\/span>\n          <!-- duplicado para loop infinito sin salto -->\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"\/><circle cx=\"6\" cy=\"12\" r=\"3\"\/><circle cx=\"18\" cy=\"19\" r=\"3\"\/><path d=\"M8.6 13.5l6.8 4M15.4 6.5l-6.8 4\"\/><\/svg><\/span>X, Instagram, TikTok &amp; LinkedIn<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\/><\/svg><\/span>Narratives &amp; messages<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8z\"\/><\/svg><\/span>Positive &amp; negative sentiment<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.6 13.4l-7.2 7.2a2 2 0 0 1-2.8 0L2 12V2h10l8.6 8.6a2 2 0 0 1 0 2.8z\"\/><circle cx=\"7\" cy=\"7\" r=\"1.5\"\/><\/svg><\/span>Topics &amp; sectors<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg><\/span>Political decision-makers<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><path d=\"M9 21V9h6v12M9 9V3M15 9V3\"\/><\/svg><\/span>Associations &amp; agents<\/span>\n          <span class=\"vc-wheel-chip\" aria-hidden=\"true\"><span class=\"chip-ico\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"\/><polyline points=\"17 6 23 6 23 12\"\/><\/svg><\/span>Conversation trends<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<div class=\"wrap\">\n\n  \n\n  <noscript>\n    <div class=\"nojs\">\n      This page uses JavaScript to show interactive charts. If you have it disabled, you can view the raw data at\n      <a href=\"\/api\/dashboard-publico\/wats\/\">\/api\/dashboard-publico\/wats\/<\/a>.\n    <\/div>\n  <\/noscript>\n\n  <!-- =========================================================\n       PRODUCTO: WATS\n       Datos: temas de conversaci\u00f3n p\u00fablica (WebVinces \/ Firestore)\n       ========================================================= -->\n  <section class=\"product-section\" aria-label=\"WATS \u00b7 Conversation topics\" itemscope=\"\" itemtype=\"https:\/\/schema.org\/Dataset\">\n    <div class=\"product-grid\">\n      <div class=\"product-content\">\n        <div class=\"product-content-header\">\n          <div>\n            <h3>Public conversation topics<\/h3>\n            <p class=\"sub\">Explore what politicians and associations say about the topics that concern you.<\/p>\n          <\/div>\n          <span class=\"period-tag\" id=\"periodo-pill\" hidden>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\"\/><path d=\"M16 2v4M8 2v4M3 10h18\"\/><\/svg>\n            <span>Period&nbsp;\u00b7&nbsp;<b id=\"periodo-text\"><\/b><\/span>\n          <\/span>\n        <\/div>\n        <div class=\"wt-tree\">\n          <div class=\"filterbar\">\n            <span class=\"flabel\">Stakeholder<\/span>\n            <button class=\"schip\" data-f=\"todos\">All<\/button>\n            <button class=\"schip\" data-f=\"pol\">Politicians<\/button>\n            <button class=\"schip\" data-f=\"aso\">Associations<\/button>\n          <\/div>\n          <div class=\"tchips\" id=\"tchips\"><\/div>\n          <div class=\"metrics\" id=\"metrics\"><\/div>\n          <div class=\"top-ents\" id=\"topents\" hidden><\/div>\n          <div class=\"scope\" id=\"scope\"><\/div>\n          <p class=\"intro\" id=\"intro\" hidden><\/p>\n          <div class=\"treebox\"><div id=\"canvas\"><\/div><div id=\"detail\" hidden><\/div><\/div>\n          <div class=\"wt-cta-bar\">\n            <p class=\"wt-cta-txt\"><strong>This is just a sample.<\/strong> Request the full analysis of your sector: all topics, stakeholders, posts and the evolution of sentiment.<\/p>\n            <button class=\"wt-cta-btn\" type=\"button\" id=\"wtCtaBtn\">Request a demo<span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/button>\n          <\/div>\n        <\/div>\n        <table class=\"sr-only\" id=\"tc-seo-table\" aria-label=\"Full data of public conversation topics\">\n          <caption>Public conversation topics detected by WATS<\/caption>\n          <thead><tr><th scope=\"col\">Topic<\/th><th scope=\"col\">Sector<\/th><th scope=\"col\">Frequency (posts)<\/th><th scope=\"col\">Sentiment<\/th><th scope=\"col\">Description<\/th><\/tr><\/thead>\n          <tbody><\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- =========================================================\n       PREGUNTAS FRECUENTES\n       ========================================================= -->\n  <section class=\"faq-section\" aria-labelledby=\"faq-title\" id=\"faq\">\n    <h2 id=\"faq-title\">Frequently asked questions<\/h2>\n    <p class=\"faq-intro\">Everything you need to know about WATS, the Vinces social intelligence tool for understanding public conversation, positions and trends.<\/p>\n    <article class=\"faq-block\" id=\"faqs-wats\">\n  <h3 class=\"faq-block-title\"><span class=\"faq-badge\">WATS<\/span> Social intelligence<\/h3>\n  <div class=\"faq-list\">\n    <details><summary>What is WATS?<\/summary><p>WATS is the Vinces social intelligence tool. It answers What Are They Saying?: what associations, opinion leaders, decision-makers and other key actors say about the topics that concern you. It analyses public conversation on social media and in the press to identify positions and trends.<\/p><\/details>\n    <details><summary>What public sources does WATS analyse?<\/summary><p>WATS analyses public conversation on social media and digital outlets, including X, LinkedIn, Instagram, TikTok, YouTube, Facebook, public Telegram, blogs and digital media.<\/p><\/details>\n    <details><summary>What analysis does WATS do on the topics detected?<\/summary><p>It organises the conversation by topic, sector, actors, tone and evolution. This helps to understand which positions are consolidating and which trends are starting to gain relevance.<\/p><\/details>\n    <details><summary>Why is it useful to understand what key actors say?<\/summary><p>Because public conversation anticipates priorities, positions and moves relevant to your organisation. WATS helps identify which topics are gaining strength, who is driving them and how they evolve on social media and in the press.<\/p><\/details>\n    <details><summary>Does it detect reputational crises?<\/summary><p>Yes. WATS alerts you when a topic associated with your organisation (or your sector) enters a negative dynamic or rapid virality.<\/p><\/details>\n    <details><summary>What metrics does it return per topic?<\/summary><p>Frequency (number of posts), dominant sentiment, sector, evolution over time, leading voices and relevant verbatim quotes.<\/p><\/details>\n    <details><summary>Can I monitor a specific topic?<\/summary><p>Yes. You define keywords or concepts and WATS delivers the activity dashboard on that topic in real time.<\/p><\/details>\n    <details><summary>Does it also follow journalists and public opinion?<\/summary><p>Yes. In addition to political officials, we index specialised journalists, sector opinion leaders, trade unions, employers\u2019 associations and associations.<\/p><\/details>\n    <details><summary>Does it work in Spanish and co-official languages?<\/summary><p>Yes. It processes content in Spanish, Catalan, Galician and Basque with the same quality.<\/p><\/details>\n    <details><summary>Does it do comparative analysis between parties?<\/summary><p>Yes. You can compare how PSOE, PP, VOX, Sumar, ERC, Junts, EH Bildu, PNV or any group addresses a topic, with what intensity and what sentiment.<\/p><\/details>\n    <details><summary>Is there an API?<\/summary><p>Yes. We provide an API to integrate the analyses into your internal dashboards.<\/p><\/details>\n    <details><summary>How much does it cost?<\/summary><p>It depends on the thematic scope and the monitoring volume. Request a tailored analysis at <a href=\"https:\/\/vincesconsulting.com\/contacto\/\" rel=\"noopener\">contact<\/a>.<\/p><\/details>\n  <\/div>\n<\/article>\n\n    \n\n  <\/section>\n\n<\/div>\n\n<script>\n\/*\n * Helpers compartidos por todas las p\u00e1ginas de producto (FREN, PolicyAlert,\n * Poder Digital, WATS). Se exponen en `window.VincesDash` para que cada\n * p\u00e1gina pueda invocarlos sin duplicar c\u00f3digo.\n *\n * IMPORTANT: las p\u00e1ginas standalone descargadas por \"Descargar HTML externo\"\n * inlinean este script. Mantenerlo autocontenido (sin imports).\n *\/\n(function () {\n  \"use strict\";\n\n  const LOCALE = \"en-GB\";\n  const REFRESH_MS = 30 * 60 * 1000;\n\n  const $ = (s, r) => (r || document).querySelector(s);\n  const $$ = (s, r) => Array.from((r || document).querySelectorAll(s));\n\n  function fmtDate(iso) {\n    if (!iso) return \"\";\n    try {\n      return new Date(iso).toLocaleDateString(LOCALE, {\n        day: \"2-digit\", month: \"long\", year: \"numeric\",\n      });\n    } catch { return iso; }\n  }\n  function fmtDateTime(iso) {\n    if (!iso) return \"\";\n    try {\n      return new Date(iso).toLocaleString(LOCALE, {\n        day: \"2-digit\", month: \"short\", year: \"numeric\",\n        hour: \"2-digit\", minute: \"2-digit\",\n      });\n    } catch { return iso; }\n  }\n  function escapeHtml(s) {\n    return String(s == null ? \"\" : s)\n      .replace(\/&\/g, \"&amp;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\")\n      .replace(\/\"\/g, \"&quot;\").replace(\/'\/g, \"&#39;\");\n  }\n  function initials(name) {\n    return (name || \"?\").trim().split(\/\\s+\/).slice(0, 2).map(p => p[0]).join(\"\").toUpperCase();\n  }\n\n  \/**\n   * Carga est\u00e1ndar de los endpoints p\u00fablicos del dashboard.\n   * - apiUrl: URL absoluta o relativa al endpoint \/api\/dashboard-publico\/...\n   * - onData: callback(data) llamado en \u00e9xito.\n   * - onError: callback(message, kind) llamado en error. kind: \"network\" | \"http\" | \"json\" | \"render\".\n   *\/\n  async function loadDashboardData(apiUrl, onData, onError) {\n    let response;\n    try {\n      response = await fetch(apiUrl, {\n        method: \"GET\",\n        headers: { Accept: \"application\/json\" },\n        mode: \"cors\",\n        cache: \"no-cache\",\n      });\n    } catch (err) {\n      console.error(\"[Dashboard] Network\/CORS error:\", err);\n      const isFileProtocol = window.location.protocol === \"file:\";\n      const msg = isFileProtocol\n        ? `No se pudieron cargar los datos desde <code>${escapeHtml(apiUrl)}<\/code>. <br>Si has abierto este HTML como archivo local, s\u00edrvelo desde un servidor web (no <code>file:\/\/<\/code>) o aseg\u00farate de que el endpoint permite el origen <code>null<\/code>.`\n        : `No se pudieron cargar los datos desde <code>${escapeHtml(apiUrl)}<\/code>. <br>Comprueba la configuraci\u00f3n CORS del backend para el origen actual: <code>${escapeHtml(window.location.origin)}<\/code>.`;\n      onError && onError(msg, \"network\");\n      return;\n    }\n    if (!response.ok) {\n      console.error(\"[Dashboard] HTTP error:\", response.status);\n      onError && onError(`El servidor devolvi\u00f3 HTTP ${response.status} al consultar <code>${escapeHtml(apiUrl)}<\/code>.`, \"http\");\n      return;\n    }\n    let data;\n    try {\n      data = await response.json();\n    } catch (err) {\n      console.error(\"[Dashboard] JSON parse error:\", err);\n      onError && onError(\"La respuesta no es JSON v\u00e1lido.\", \"json\");\n      return;\n    }\n    try {\n      onData && onData(data);\n    } catch (err) {\n      console.error(\"[Dashboard] Render error:\", err);\n      onError && onError(\"Error al renderizar los datos.\", \"render\");\n    }\n  }\n\n  \/**\n   * Pinta el pill de \"Actualizado...\" en la cabecera y gestiona el estado de error.\n   *\/\n  function setUpdatedPill(data, errMessage) {\n    const pill = $(\"#updated-pill\");\n    const txt = $(\"#updated-text\");\n    if (!pill || !txt) return;\n    if (errMessage) {\n      pill.classList.add(\"err\");\n      txt.textContent = errMessage;\n    } else {\n      pill.classList.remove(\"err\");\n      txt.textContent = \"Updated \" + fmtDateTime((data && data.generated_at) || new Date().toISOString());\n    }\n  }\n\n  \/**\n   * Bot\u00f3n \"Descargar HTML externo\": clona el DOM, elimina elementos de test,\n   * sustituye la API_URL relativa por una absoluta y descarga como fichero\n   * \u00fanico listo para WordPress.\n   *\/\n  function bindDownloadExternalHtml(absApiUrl) {\n    const btn = $(\"#download-html-btn\");\n    if (!btn) return;\n    btn.addEventListener(\"click\", () => {\n      try {\n        btn.dataset.state = \"generating\";\n        btn.querySelector(\".lbl\").textContent = \"Generando\u2026\";\n\n        const cloned = document.documentElement.cloneNode(true);\n        cloned.querySelectorAll(\".testbar, #download-html-btn\").forEach(el => el.remove());\n\n        cloned.querySelectorAll(\"script\").forEach(s => {\n          const txt = s.textContent || \"\";\n          if (txt.includes(\"DEFAULT_API_URL\")) {\n            s.textContent = txt.replace(\n              \/const\\s+DEFAULT_API_URL\\s*=\\s*[\"'][^\"']*[\"'];\/,\n              `const DEFAULT_API_URL = ${JSON.stringify(absApiUrl)};`\n            );\n          }\n        });\n\n        const banner =\n          \"\\n<!--\\n\" +\n          \"  Dashboard Vinces \u00b7 p\u00e1gina standalone por producto\\n\" +\n          \"  Generado: \" + new Date().toISOString() + \"\\n\" +\n          \"  Endpoint API: \" + absApiUrl + \"\\n\" +\n          \"\\n\" +\n          \"  C\u00f3mo integrarlo en WordPress:\\n\" +\n          \"    1. Editor de la p\u00e1gina \u2192 bloque 'HTML personalizado'.\\n\" +\n          \"    2. Pega el fichero completo (todo, incluyendo <html>, <head>, <body>).\\n\" +\n          \"       En la mayor\u00eda de temas WP basta con pegar a partir de <body>.\\n\" +\n          \"    3. Aseg\u00farate de que el dominio WP est\u00e1 incluido en CORS del backend.\\n\" +\n          \"    4. El cliente refresca cada 30 min; el backend cachea 1h.\\n\" +\n          \"-->\\n\";\n        const html = \"<!DOCTYPE html>\\n\" + cloned.outerHTML.replace(\/^<html\/, banner + \"<html\");\n\n        const blob = new Blob([html], { type: \"text\/html;charset=utf-8\" });\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement(\"a\");\n        a.href = url;\n        const stamp = new Date().toISOString().slice(0, 10);\n        a.download = `dashboard-vinces-${(window.VincesDash && window.VincesDash.product) || \"page\"}-${stamp}.html`;\n        document.body.appendChild(a);\n        a.click();\n        document.body.removeChild(a);\n        setTimeout(() => URL.revokeObjectURL(url), 2000);\n\n        btn.dataset.state = \"done\";\n        btn.querySelector(\".lbl\").textContent = \"\u2714 Descargado\";\n        setTimeout(() => {\n          btn.removeAttribute(\"data-state\");\n          btn.querySelector(\".lbl\").textContent = \"Download standalone HTML\";\n        }, 2500);\n      } catch (err) {\n        console.error(\"[download-html] error:\", err);\n        btn.removeAttribute(\"data-state\");\n        btn.querySelector(\".lbl\").textContent = \"Generation error\";\n        setTimeout(() => { btn.querySelector(\".lbl\").textContent = \"Download standalone HTML\"; }, 2500);\n      }\n    });\n  }\n\n  \/**\n   * Inicializa carruseles tipo tabs sobre cualquier elemento [data-carousel].\n   * Cuando un pane se activa, ejecuta el callback registrado en\n   * window.VincesDash.onPaneActivated[paneId] (si existe).\n   *\/\n  function initCarousels() {\n    document.querySelectorAll(\"[data-carousel]\").forEach(scope => {\n      const tabs = scope.querySelectorAll(\".car-tab\");\n      const panes = scope.querySelectorAll(\".car-pane\");\n      tabs.forEach(btn => {\n        btn.addEventListener(\"click\", () => {\n          const target = btn.getAttribute(\"data-pane\");\n          tabs.forEach(b => {\n            b.classList.toggle(\"active\", b === btn);\n            b.setAttribute(\"aria-selected\", b === btn ? \"true\" : \"false\");\n          });\n          panes.forEach(p => {\n            p.classList.toggle(\"active\", p.id === target);\n          });\n          const cb = window.VincesDash && window.VincesDash.onPaneActivated && window.VincesDash.onPaneActivated[target];\n          if (typeof cb === \"function\") cb();\n        });\n      });\n    });\n  }\n\n  window.VincesDash = Object.assign(window.VincesDash || {}, {\n    LOCALE,\n    REFRESH_MS,\n    $, $$,\n    fmtDate, fmtDateTime, escapeHtml, initials,\n    loadDashboardData,\n    setUpdatedPill,\n    bindDownloadExternalHtml,\n    initCarousels,\n    onPaneActivated: {},\n  });\n})();\n<\/script>\n\n\n<script>\n(() => {\n  \"use strict\";\n  const DEFAULT_API_URL = \"https:\/\/vision360.vincesconsulting.com\/api\/dashboard-publico\/wats\/\";\n  const { $, fmtDate, escapeHtml, loadDashboardData, setUpdatedPill, bindDownloadExternalHtml } = window.VincesDash;\n  const REFRESH_MS = window.VincesDash.REFRESH_MS;\n  window.VincesDash.product = \"wats\";\n  const esc = escapeHtml;\n\n  \/* ===== Etiquetas de \u00e1mbito (para tablas SEO + meta) ===== *\/\n  const TC_AMBITO_LABELS = {\n    \"todos\":{label:\"Todos los \u00e1mbitos\"},\"sanidad\":{label:\"Sanidad\"},\"vivienda\":{label:\"Vivienda\"},\n    \"economia\":{label:\"Econom\u00eda y empleo\"},\"educacion\":{label:\"Educaci\u00f3n\"},\"fiscalidad\":{label:\"Fiscalidad\"},\n    \"medioambiente\":{label:\"Medio ambiente\"},\"energia\":{label:\"Energ\u00eda\"},\"social\":{label:\"Social\"},\n    \"infraestructuras\":{label:\"Infraestructuras\"},\"politica\":{label:\"Pol\u00edtica\"},\n  };\n\n  \/* ===== Tablas SEO (temas_conversacion; fallback al informe report) ===== *\/\n  function seoRowsFromReport(rep) {\n    const out = [];\n    (rep.themes || []).forEach(t => {\n      (t.sub || []).forEach(s => {\n        out.push({\n          topic: s.label || \"\",\n          ambito: t.label || t.id || \"\",\n          frequency: (s.pol || 0) + (s.aso || 0),\n          sentiment: s.sent || \"\",\n          description: s.summary || \"\",\n        });\n      });\n    });\n    return out.sort((a, b) => (b.frequency || 0) - (a.frequency || 0));\n  }\n  function renderSeoTables(data) {\n    const tc = data.temas_conversacion;\n    let items = (tc && tc.topics) || [];\n    let labelOf = t => TC_AMBITO_LABELS[t.ambito]?.label || t.ambito || \"\u2014\";\n    if (!items.length && data.report && (data.report.themes || []).length) {\n      items = seoRowsFromReport(data.report);\n      labelOf = t => t.ambito || \"\u2014\";\n    }\n    const convBody = document.querySelector(\"#seo-table-conversacion tbody\");\n    if (convBody) {\n      if (!items.length) {\n        convBody.innerHTML = '<tr><td colspan=\"5\" class=\"muted-cell\">Sin datos de conversaci\u00f3n p\u00fablica disponibles.<\/td><\/tr>';\n      } else {\n        const sorted = [...items].sort((a, b) => (b.frequency || 0) - (a.frequency || 0));\n        convBody.innerHTML = sorted.map(t => {\n          return `<tr><td>${esc(t.topic || \"\u2014\")}<\/td><td>${esc(labelOf(t))}<\/td><td>${t.frequency || 0}<\/td><td>${esc(t.sentiment || \"\u2014\")}<\/td><td>${esc(t.description || \"\")}<\/td><\/tr>`;\n        }).join(\"\");\n      }\n    }\n    const seoBody = document.querySelector(\"#tc-seo-table tbody\");\n    if (seoBody) {\n      seoBody.innerHTML = items.map(t => {\n        return `<tr><td>${esc(t.topic)}<\/td><td>${esc(labelOf(t))}<\/td><td>${t.frequency || 0}<\/td><td>${esc(t.sentiment || \"\")}<\/td><td>${esc(t.description || \"\")}<\/td><\/tr>`;\n      }).join(\"\");\n    }\n  }\n\n  \/* ===== Meta del panel CTA izquierdo ===== *\/\n  function updateMeta(data) {\n    const tc = data.temas_conversacion || {};\n    const rep = data.report || {};\n    \/\/ Periodo analizado \u2192 badge de cabecera (siempre visible)\n    let periodoTxt = \"\";\n    const iDate = tc.initial_date || rep.initial_date || (rep.period && rep.period.initial_date);\n    const eDate = tc.end_date || rep.end_date || (rep.period && rep.period.end_date);\n    if (iDate && eDate) {\n      const a = new Date(iDate), b = new Date(eDate);\n      const fmt = d => d.toLocaleDateString(\"es-ES\", { day:\"numeric\", month:\"short\" }).replace(\".\", \"\");\n      periodoTxt = `${a.getDate()}\\u2013${fmt(b)} ${b.getFullYear()}`;\n    }\n    const pPill = document.getElementById(\"periodo-pill\"), pTxt = document.getElementById(\"periodo-text\");\n    if (pPill && pTxt) { if (periodoTxt) { pTxt.textContent = periodoTxt; pPill.hidden = false; } else { pPill.hidden = true; } }\n\n    const metaEl = document.querySelector(\"[data-stat='meta']\");\n    if (!metaEl) return;\n    const repThemes = rep.themes || [];\n    const repSubs = repThemes.reduce((n, t) => n + ((t.sub || []).length), 0);\n    const topics = tc.topics || [];\n    const total = repSubs || tc.total_topics || topics.length;\n    const ambitos = repThemes.length || new Set(topics.map(t => t.ambito)).size;\n    const ICONS = {\n      topics:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3v18h18\"\/><path d=\"M7 14l4-4 4 4 5-7\"\/><\/svg>',\n      tag:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"\/><circle cx=\"7\" cy=\"7\" r=\"1.2\" fill=\"currentColor\"\/><\/svg>',\n      cal:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\"\/><path d=\"M16 2v4M8 2v4M3 10h18\"\/><\/svg>',\n    };\n    const li = [\n      `<li>${ICONS.topics}<span><b>${total}<\/b> temas<\/span><\/li>`,\n      ambitos ? `<li>${ICONS.tag}<span><b>${ambitos}<\/b> \\u00e1mbitos<\/span><\/li>` : \"\",\n      periodoTxt ? `<li>${ICONS.cal}<span>${esc(periodoTxt)}<\/span><\/li>` : \"\",\n    ].filter(Boolean);\n    metaEl.innerHTML = li.join(\"\");\n  }\n\n  \/* ===== Treemap de tendencias ===== *\/\n  const GROUPS = { pol:{label:\"Politicians\",color:\"#1F2547\"}, aso:{label:\"Associations\",color:\"#B9C2D9\"}, todos:{label:\"All\",color:\"#8A90A3\"} };\n  const SENTC = { positivo:{c:\"#2E7D4A\",l:\"Positive\"}, neutro:{c:\"#E3B341\",l:\"Neutral\"}, neutral:{c:\"#E3B341\",l:\"Neutral\"}, mixto:{c:\"#F3A53A\",l:\"Mixed\"}, negativo:{c:\"#C0392B\",l:\"Negative\"} };\n  function sentColor(s){ return (SENTC[s]||SENTC.mixto).c; }\n  const NET = { x:\"X\", instagram:\"Instagram\", linkedin:\"LinkedIn\", tiktok:\"TikTok\" };\n  const NET_ICONS = {\n    x:'<path d=\"M4 4l16 16M20 4L4 20\"\/>',\n    instagram:'<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"5\"\/><circle cx=\"12\" cy=\"12\" r=\"4\"\/><circle cx=\"17\" cy=\"7\" r=\"1.05\" fill=\"currentColor\" stroke=\"none\"\/>',\n    linkedin:'<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"3.5\"\/><path d=\"M7.6 10.6V16M7.6 7.7v.02M11 16v-3.3a1.9 1.9 0 0 1 3.8 0V16\"\/>',\n    tiktok:'<path d=\"M9.6 5v9.7a3.1 3.1 0 1 1-3.1-3.1\"\/><path d=\"M9.6 5c.5 2.7 2.4 4.4 5.2 4.6\"\/>'\n  };\n  function netIcon(net){ const p=NET_ICONS[(net||\"\").toLowerCase()]; return p?'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">'+p+'<\/svg>':''; }\n  let THEMES = [], st = { filter:\"todos\", level:1, theme:null, sub:null };\n  function _h2hsl(hex){ const m=\/^#?([0-9a-f]{6})$\/i.exec(hex||\"\"); if(!m) return null; const n=parseInt(m[1],16); let r=(n>>16&255)\/255,g=(n>>8&255)\/255,b=(n&255)\/255; const mx=Math.max(r,g,b),mn=Math.min(r,g,b); let h=0,s=0,l=(mx+mn)\/2; if(mx!==mn){ const d=mx-mn; s=l>.5?d\/(2-mx-mn):d\/(mx+mn); h=mx===r?(g-b)\/d+(g<b?6:0):mx===g?(b-r)\/d+2:(r-g)\/d+4; h\/=6; } return {h:h*360,s:s,l:l}; }\n  function _hsl2h(h,s,l){ h\/=360; const f=(p,q,t)=>{ if(t<0)t++; if(t>1)t--; if(t<1\/6)return p+(q-p)*6*t; if(t<1\/2)return q; if(t<2\/3)return p+(q-p)*(2\/3-t)*6; return p; }; let r,g,b; if(s===0){r=g=b=l;}else{ const q=l<.5?l*(1+s):l+s-l*s,p=2*l-q; r=f(p,q,h+1\/3);g=f(p,q,h);b=f(p,q,h-1\/3); } const to=v=>('0'+Math.round(v*255).toString(16)).slice(-2); return '#'+to(r)+to(g)+to(b); }\n  function intenseColor(hex){ const c=_h2hsl(hex); if(!c) return hex; return _hsl2h(c.h,Math.max(0.3,Math.min(c.s,0.46)),Math.min(c.l,0.45)); }\n  function softenThemes(){ THEMES.forEach(t=>{ const c=_h2hsl(t.color); if(!c) return; t._c0=t.color; const s=Math.min(c.s*0.8,0.46), l=c.l+(1-c.l)*0.25; t.color=_hsl2h(c.h,s,l); }); }\n\n  \/* Iconos por \u00e1mbito (se ti\u00f1en con el color del tema v\u00eda currentColor) *\/\n  const TOPIC_ICONS = {\n    sanidad:'<rect x=\"9.5\" y=\"3\" width=\"5\" height=\"18\" rx=\"1\"\/><rect x=\"3\" y=\"9.5\" width=\"18\" height=\"5\" rx=\"1\"\/>',\n    vivienda:'<path d=\"M3 11l9-8 9 8\"\/><path d=\"M5 10v10h14V10\"\/>',\n    economia:'<path d=\"M3 17l6-6 4 4 7-8\"\/><path d=\"M17 7h4v4\"\/>',\n    educacion:'<path d=\"M2 8l10-4 10 4-10 4z\"\/><path d=\"M6 10.5V16c0 1.5 3 3 6 3s6-1.5 6-3v-5.5\"\/>',\n    fiscalidad:'<line x1=\"19\" y1=\"5\" x2=\"5\" y2=\"19\"\/><circle cx=\"7.5\" cy=\"7.5\" r=\"2.4\"\/><circle cx=\"16.5\" cy=\"16.5\" r=\"2.4\"\/>',\n    medioambiente:'<path d=\"M5 20s1.5-11 15-15c0 0 1.5 11-8 15-3.5 1.4-7 0-7 0z\"\/><path d=\"M5 20c3.5-5.5 7.5-8 11.5-9\"\/>',\n    energia:'<path d=\"M13 2L4 14h7l-1 8 9-12h-7z\"\/>',\n    social:'<circle cx=\"9\" cy=\"8\" r=\"3.1\"\/><path d=\"M3.5 20c0-3.3 2.8-5.3 5.5-5.3s5.5 2 5.5 5.3\"\/><path d=\"M16 5.4a3 3 0 0 1 0 5.7\"\/><path d=\"M20.5 20c0-2.5-1.5-4.2-3.4-4.9\"\/>',\n    infraestructuras:'<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"1\"\/><path d=\"M8 7h2M14 7h2M8 11h2M14 11h2M8 15h2M14 15h2\"\/>',\n    politica:'<path d=\"M3 9l9-6 9 6\"\/><path d=\"M5 9v9M9.5 9v9M14.5 9v9M19 9v9\"\/><path d=\"M3 21h18\"\/>',\n    _default:'<circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M8.5 10h7M8.5 14h5\"\/>'\n  };\n  function topicIcon(id,label){\n    let k=(id||\"\").toLowerCase();\n    if(!TOPIC_ICONS[k]){ const L=(label||\"\").toLowerCase(); k=Object.keys(TOPIC_ICONS).find(key=>key!==\"_default\"&&L.indexOf(key)>=0)||\"\"; }\n    const p=TOPIC_ICONS[k]||TOPIC_ICONS._default;\n    return '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">'+p+'<\/svg>';\n  }\n\n  function vol(sub, f){ return f === \"todos\" ? ((sub.pol||0)+(sub.aso||0)) : (sub[f]||0); }\n  function themeVol(t, f){ return (t.sub||[]).reduce((s,x)=>s+vol(x,f),0); }\n  function hex2rgb(h){ h=h.replace(\"#\",\"\"); return [parseInt(h.substr(0,2),16),parseInt(h.substr(2,2),16),parseInt(h.substr(4,2),16)]; }\n  function lum(r,g,b){ return 0.299*r+0.587*g+0.114*b; }\n  function fgFor(hex){ const c=hex2rgb(hex); return lum(c[0],c[1],c[2])>150?\"#1F2547\":\"#ffffff\"; }\n  function tint(hex,f){ const c=hex2rgb(hex),w=(1-f)*0.82; const r=Math.round(c[0]+(255-c[0])*w),g=Math.round(c[1]+(255-c[1])*w),b=Math.round(c[2]+(255-c[2])*w); return {css:\"rgb(\"+r+\",\"+g+\",\"+b+\")\",fg:lum(r,g,b)>150?\"#1F2547\":\"#ffffff\"}; }\n  function worst(row,s,side){ let rmax=-Infinity,rmin=Infinity; for(let k=0;k<row.length;k++){ if(row[k].a>rmax)rmax=row[k].a; if(row[k].a<rmin)rmin=row[k].a; } const s2=s*s,w2=side*side; return Math.max((w2*rmax)\/s2, s2\/(w2*rmin)); }\n  function treemap(values,width,height){\n    const idx=values.map((v,i)=>({a:v,i})).sort((a,b)=>b.a-a.a);\n    const total=idx.reduce((s,o)=>s+o.a,0)||1, scale=(width*height)\/total;\n    const items=idx.map(o=>({a:o.a*scale,i:o.i})), out=new Array(values.length);\n    let x=0,y=0,w=width,h=height,i=0;\n    while(i<items.length){\n      const side=Math.min(w,h); let row=[items[i]],s=items[i].a,j=i+1;\n      while(j<items.length){ const ns=s+items[j].a; if(worst(row.concat(items[j]),ns,side)<=worst(row,s,side)){ row.push(items[j]); s=ns; j++; } else break; }\n      const thick=s\/side;\n      if(w>=h){ let oy=y; for(let r=0;r<row.length;r++){ const chh=(row[r].a\/s)*h; out[row[r].i]={x,y:oy,w:thick,h:chh}; oy+=chh; } x+=thick; w-=thick; }\n      else{ let ox=x; for(let r2=0;r2<row.length;r2++){ const cww=(row[r2].a\/s)*w; out[row[r2].i]={x:ox,y,w:cww,h:thick}; ox+=cww; } y+=thick; h-=thick; }\n      i=j;\n    }\n    return out;\n  }\n  function build(container,items){\n    container.innerHTML=\"\";\n    const W=container.clientWidth||640, H=container.clientHeight||520;\n    const rects=treemap(items.map(it=>it.value),W,H);\n    items.forEach((it,idx)=>{\n      const r=rects[idx],box=document.createElement(\"div\");box.className=\"box\";\n      box.style.left=(r.x+3)+\"px\";box.style.top=(r.y+3)+\"px\";box.style.width=Math.max(0,r.w-6)+\"px\";box.style.height=Math.max(0,r.h-6)+\"px\";\n      box.style.background=it.color;box.style.color=it.fg;\n      if(r.w>48&&r.h>30){ const lbl=document.createElement(\"div\");lbl.className=\"lbl\";lbl.textContent=it.label;lbl.style.fontSize=Math.max(12,Math.min(20,Math.round(r.w\/10)))+\"px\";box.appendChild(lbl);\n        if(r.h>58){ const num=document.createElement(\"div\");num.className=\"num\";num.textContent=it.num;box.appendChild(num); } }\n      box.onclick=it.onclick;container.appendChild(box);\n    });\n  }\n  const canvas=document.getElementById(\"canvas\"), detail=document.getElementById(\"detail\"), scope=document.getElementById(\"scope\"), intro=document.getElementById(\"intro\");\n  function allSubs(){ const a=[]; THEMES.forEach(t=>{(t.sub||[]).forEach(x=>a.push(x));}); return a; }\n  function renderMetrics(){\n    const f=st.filter, subs=subsInView();\n    \/\/ Reparto pol\/aso sobre el \u00e1mbito en vista (cambia con el filtro de tema)\n    const polV=subs.reduce((s,x)=>s+(x.pol||0),0), asoV=subs.reduce((s,x)=>s+(x.aso||0),0), tot2=(polV+asoV)||1;\n    const polPct=Math.round(polV\/tot2*100), asoPct=100-polPct;\n    const polC=GROUPS.pol.color, asoC=GROUPS.aso.color;\n    const repartoHTML='<div class=\"split\"><div class=\"split-bar\">'+\n      '<span class=\"seg\" data-g=\"pol\" title=\"Politicians '+polPct+'%\" style=\"width:'+polPct+'%;background:'+polC+'\"><\/span>'+\n      '<span class=\"seg\" data-g=\"aso\" title=\"Associations '+asoPct+'%\" style=\"width:'+asoPct+'%;background:'+asoC+'\"><\/span><\/div>'+\n      '<div class=\"split-legend\"><span data-g=\"pol\"><i style=\"background:'+polC+'\"><\/i>Pol. <b>'+polPct+'%<\/b><\/span>'+\n      '<span data-g=\"aso\"><i style=\"background:'+asoC+'\"><\/i>Aso. <b>'+asoPct+'%<\/b><\/span><\/div><\/div>';\n    \/\/ Sentimiento sobre el \u00e1mbito en vista (cambia con el filtro de tema)\n    const sentDefs=[\n      {g:\"pos\",keys:[\"positivo\"],label:\"Pos.\",color:\"#4FA873\"},\n      {g:\"neu\",keys:[\"neutro\",\"neutral\"],label:\"Neu.\",color:\"#EDBB3C\"},\n      {g:\"mix\",keys:[\"mixto\"],label:\"Mix.\",color:\"#F3A53A\"},\n      {g:\"neg\",keys:[\"negativo\"],label:\"Neg.\",color:\"#D15F4D\"}\n    ];\n    let sTot=0; sentDefs.forEach(d=>{ d.v=subs.filter(x=>d.keys.indexOf(x.sent)>=0).reduce((s,x)=>s+vol(x,f),0); sTot+=d.v; }); sTot=sTot||1;\n    const sentBar='<div class=\"split\"><div class=\"split-bar\">'+\n      sentDefs.map(d=>{ const w=d.v\/sTot*100; return w>0?'<span class=\"seg\" data-g=\"s_'+d.g+'\" title=\"'+d.label.replace(\".\",\"\")+' '+Math.round(w)+'%\" style=\"width:'+w+'%;background:'+d.color+'\"><\/span>':''; }).join('')+\n      '<\/div><div class=\"split-legend\">'+\n      sentDefs.map(d=>{ const w=d.v\/sTot*100; return w>0?'<span data-g=\"s_'+d.g+'\"><i style=\"background:'+d.color+'\"><\/i>'+d.label+' <b>'+Math.round(w)+'%<\/b><\/span>':''; }).join('')+\n      '<\/div><\/div>';\n    \/\/ Positivo \/ negativo: temas (vista general) o subtemas del tema seleccionado\n    let best, worst, useIcon=false;\n    if(st.theme){\n      const tv=themeVol(st.theme,f)||0, ssub=st.theme.sub||[];\n      const pick=(sent)=>{ let c=null,mv=-1; ssub.forEach(s=>{ if(s.sent===sent){ const vv=vol(s,f); if(vv>mv){mv=vv;c=s;} } }); return c?{label:c.label,r:tv>0?vol(c,f)\/tv:0,has:true}:{label:\"\u2014\",r:0,has:false}; };\n      best=pick(\"positivo\"); worst=pick(\"negativo\");\n    } else {\n      useIcon=true;\n      best={label:\"\u2014\",id:\"\",color:\"\",r:-1,has:false}; worst={label:\"\u2014\",id:\"\",color:\"\",r:-1,has:false};\n      THEMES.forEach(t=>{ const tv=themeVol(t,f); if(tv<=0) return;\n        const pos=(t.sub||[]).filter(x=>x.sent===\"positivo\").reduce((s,x)=>s+vol(x,f),0)\/tv;\n        const neg=(t.sub||[]).filter(x=>x.sent===\"negativo\").reduce((s,x)=>s+vol(x,f),0)\/tv;\n        if(pos>best.r) best={label:t.label,id:t.id,color:t.color,r:pos,has:true};\n        if(neg>worst.r) worst={label:t.label,id:t.id,color:t.color,r:neg,has:true}; });\n    }\n    const oneCard=(o,kind)=>'<div class=\"climate-one\"><div class=\"cl-top\">'+((useIcon&&o.id)?'<span class=\"cl-ic\">'+topicIcon(o.id,o.label)+'<\/span>':'')+'<span class=\"cl-pct '+kind+'\">'+(o.has?Math.round(Math.max(o.r,0)*100)+'%':'\u2014')+'<\/span><\/div><span class=\"cl-nm\">'+esc(o.label)+'<\/span><\/div>';\n    const m=[\n      {k:\"Politicians vs Associations\",v:repartoHTML},\n      {k:'<span style=\"color:#3F875C\">\u25b2 Positive<\/span>',v:oneCard(best,\"pos\")},\n      {k:'<span style=\"color:#C2564A\">\u25bc Negative<\/span>',v:oneCard(worst,\"neg\")},\n      {k:\"Sentiment\",v:sentBar}\n    ];\n    $(\"#metrics\").innerHTML=m.map(x=>'<div class=\"metric\"><p class=\"k\">'+x.k+'<\/p><div class=\"v\">'+x.v+'<\/div><\/div>').join(\"\");\n  }\n  function subsInView(){\n    if(st.level===2 && st.theme) return st.theme.sub||[];\n    if(st.level===3 && st.sub) return [st.sub];\n    return allSubs();\n  }\n  function subEntities(s){\n    \/* El backend ya env\u00eda sub[].entities[] (name, group, count real, role). *\/\n    return (s && s.entities && s.entities.length) ? s.entities : [];\n  }\n  function roleLabel(group,role){ if(role) return role; if(group===\"pol\") return \"Public office\"; if(group===\"aso\") return \"Association\"; return \"\"; }\n  \/* Versi\u00f3n corta del cargo para los pills compactos (texto antes de \" \u00b7 \" o \" (\") *\/\n  function shortRole(group,role){ const full=roleLabel(group,role); if(!full) return \"\"; return full.split(\/\\s\u00b7\\s|\\s*\\(\/)[0].trim(); }\n  const STOP = new Set(\"de la el en y a los las del un una que con por para se su sus al lo como mas m\u00e1s o e u ni entre sobre sin tras este esta estos estas ese esa eso son ha han hay no si s\u00ed ya muy tambi\u00e9n tan tanto cada uno dos tres esta est\u00e1n fue ser es las les le nos seg\u00fan hacia desde durante mientras cuando donde quien cual cuales todo toda todos todas otro otra otros otras mismo misma pero porque aunque sino ante bajo cabe contra hasta para pues c\u00f3mo qu\u00e9 cu\u00e1l qui\u00e9n d\u00f3nde m\u00e1s menos hace hacen tras ello esto eso aqu\u00ed all\u00ed han haber sido sera ser\u00e1\".split(\/\\s+\/));\n  function topConcepts(x,n){\n    const parts=[x.summary||\"\"]; (x.top_posts||[]).forEach(p=>parts.push(p.text||\"\"));\n    if(x.pos){ [\"pol\",\"aso\"].forEach(g=>{ if(x.pos[g]&&x.pos[g].stance) parts.push(x.pos[g].stance); }); }\n    const freq=Object.create(null);\n    (parts.join(\" \").toLowerCase().match(\/[a-z\u00e1\u00e9\u00ed\u00f3\u00fa\u00f1\u00fc]{4,}\/gi)||[]).forEach(w=>{ if(STOP.has(w)) return; freq[w]=(freq[w]||0)+1; });\n    return Object.keys(freq).sort((a,b)=>freq[b]-freq[a]).filter(w=>freq[w]>1).slice(0,n)\n      .map(w=>w.charAt(0).toUpperCase()+w.slice(1));\n  }\n  function renderTopEntities(){\n    const box=document.getElementById(\"topents\"); if(!box) return;\n    const f=st.filter, subs=subsInView(), agg=Object.create(null);\n    subs.forEach(s=>{ subEntities(s).forEach(e=>{\n      if(!e||!e.name) return;\n      if(f!==\"todos\" && e.group && e.group!==f) return;\n      const c=+e.count||0; if(c<=0) return;\n      const a=agg[e.name]||(agg[e.name]={name:e.name,count:0,group:e.group||\"\",role:e.role||\"\"});\n      a.count+=c; if(!a.role && e.role) a.role=e.role; if(!a.group && e.group) a.group=e.group;\n    }); });\n    const top=Object.keys(agg).map(k=>agg[k]).sort((a,b)=>b.count-a.count).slice(0,4);\n    if(!top.length){ box.hidden=true; box.innerHTML=\"\"; return; }\n    box.hidden=false;\n    const themed = st.theme ? tint(st.theme.color,0.45) : null;\n    const rkStyle = themed ? ' style=\"background:'+themed.css+';color:'+themed.fg+'\"' : '';\n    box.innerHTML='<p class=\"k\">Most active stakeholders<\/p><ol>'+\n      top.map((e,i)=>{ const r=shortRole(e.group,e.role), rFull=roleLabel(e.group,e.role);\n        return '<li class=\"ent-row\" data-ent=\"'+esc(e.name)+'\" role=\"button\" tabindex=\"0\" title=\"'+esc(e.name)+(rFull?' \u2014 '+esc(rFull):'')+'\"><span class=\"rk\"'+rkStyle+'>'+(i+1)+'<\/span><span class=\"ent\"><span class=\"nm\">'+esc(e.name)+'<\/span>'+\n          (r?'<span class=\"role\">'+esc(r)+'<\/span>':'')+'<\/span>'+\n          '<span class=\"ct\" title=\"'+e.count.toLocaleString(\"es-ES\")+' mentions\">('+e.count.toLocaleString(\"es-ES\")+')<\/span><\/li>'; }).join(\"\")+'<\/ol>';\n  }\n  function renderChips(){\n    const nav=$(\"#tchips\");\n    nav.innerHTML='<span class=\"flabel\">Temas<\/span>'+\n      '<button class=\"tchip\" data-amb=\"todos\" style=\"border-color:var(--line);color:var(--ink)\">Todos<\/button>'+\n      THEMES.map(t=>'<button class=\"tchip\" data-amb=\"'+t.id+'\" style=\"border-color:var(--line);color:var(--ink)\">'+esc(t.label)+'<\/button>').join(\"\");\n    Array.prototype.forEach.call(nav.querySelectorAll(\"button\"),b=>{ b.onclick=()=>{ const id=b.getAttribute(\"data-amb\"); if(id===\"todos\")goLevel1(); else goLevel2(THEMES.filter(t=>t.id===id)[0]); }; });\n    updateChips();\n  }\n  function updateChips(){\n    const cur=st.theme?st.theme.id:\"todos\";\n    Array.prototype.forEach.call(document.querySelectorAll(\"#tchips .tchip\"),b=>{\n      const id=b.getAttribute(\"data-amb\"),on=id===cur;\n      if(id===\"todos\"){ b.style.background=on?\"#1F2547\":\"#fff\"; b.style.color=on?\"#fff\":\"var(--ink)\"; b.style.borderColor=on?\"#1F2547\":\"var(--line)\"; }\n      else{ const t=THEMES.filter(x=>x.id===id)[0]; if(t){ b.style.background=on?t.color:\"#fff\"; b.style.color=on?fgFor(t.color):\"var(--ink)\"; b.style.borderColor=on?t.color:\"var(--line)\"; } }\n    });\n  }\n  function render(){\n    if(!THEMES.length){ canvas.innerHTML='<p class=\"wt-empty\">Sin datos.<\/p>'; return; }\n    renderMetrics(); renderTopEntities(); updateChips();\n    if(st.level<3){ detail.hidden=true; canvas.style.display=\"\"; }\n    if(st.level===1){\n      intro.hidden=true; scope.textContent=\"Sectors by conversation volume \u00b7 \"+GROUPS[st.filter].label;\n      build(canvas,THEMES.map(t=>{ const v=themeVol(t,st.filter); return {value:v,label:t.label,color:t.color,fg:fgFor(t.color),num:v+\" mentions \u00b7 \"+(t.sub||[]).length+\" topics\",onclick:()=>goLevel2(t)}; }));\n    } else if(st.level===2){\n      intro.hidden=true; intro.textContent=\"\";\n      scope.textContent=\"Topics by conversation volume \u00b7 \"+GROUPS[st.filter].label;\n      const vols=st.theme.sub.map(x=>vol(x,st.filter)),mn=Math.min.apply(null,vols),mx=Math.max.apply(null,vols);\n      build(canvas,st.theme.sub.map(x=>{ const v=vol(x,st.filter); let f=mx>mn?(v-mn)\/(mx-mn):1; f=0.25+0.75*f; const tt=tint(st.theme.color,f); return {value:Math.max(v,0.5),label:x.label,color:tt.css,fg:tt.fg,num:v+\" mentions\",onclick:()=>goLevel3(x)}; }));\n    } else renderPos();\n  }\n  function renderPos(){\n    intro.hidden=true; canvas.style.display=\"none\"; detail.hidden=false; detail.className=\"pos\";\n    const t=st.theme,x=st.sub,v=vol(x,st.filter),sc=SENTC[x.sent]||SENTC.mixto;\n    scope.textContent=\"\";\n    const groups=st.filter===\"todos\"?[\"pol\",\"aso\"]:[st.filter];\n    \/\/ Cabecera: bot\u00f3n volver a la izquierda + t\u00edtulo del subtema; breadcrumb peque\u00f1o debajo\n    const head='<div class=\"phead\"><button class=\"back\" id=\"back\">\u2190 Back to '+esc(t.label)+'<\/button>'+\n      '<h3 class=\"ptitle\">'+esc(x.label)+'<\/h3><\/div>'+\n      '<p class=\"pcrumb\">'+esc(GROUPS[st.filter].label+\" \u00b7 \"+t.label+\" \u00b7 \"+x.label)+'<\/p>';\n    \/\/ Descripci\u00f3n del tema (dos columnas: descripci\u00f3n | conceptos)\n    let desc='<div class=\"pdesc\"><div class=\"pdesc-col\"><h4 class=\"pdesc-h\">Topic description<\/h4>'+\n      '<p class=\"psummary\">'+esc(x.summary||\"No description available for this topic.\")+'<\/p><\/div>';\n    const concepts=topConcepts(x,8);\n    if(concepts.length){ desc+='<div class=\"pdesc-col pconcepts\"><span class=\"pconcepts-h\">Most repeated concepts<\/span><div class=\"pconcepts-row\">'+concepts.map(c=>'<span class=\"pconcept\">'+esc(c)+'<\/span>').join(\"\")+'<\/div><\/div>'; }\n    desc+='<\/div>';\n    \/\/ Columna izquierda: qu\u00e9 dicen pol\u00edticos y asociaciones\n    let left='<div class=\"col-h\">What they say \u00b7 '+v+' mentions<\/div>';\n    groups.forEach(g=>{ const p=(x.pos&&x.pos[g])||{stance:\"\",orgs:[]};\n      left+='<div class=\"pgroup\" style=\"--gc:'+GROUPS[g].color+'\"><h3><span class=\"gd\" style=\"background:'+GROUPS[g].color+'\"><\/span>'+GROUPS[g].label+' \u00b7 '+(x[g]||0)+' mentions<\/h3>'+\n        '<p class=\"pstance\">'+esc(p.stance||\"\u2014\")+'<\/p><div class=\"orgs\">'+(p.orgs||[]).map(o=>'<span class=\"org\">'+esc(o)+'<\/span>').join(\"\")+'<\/div><\/div>'; });\n    \/\/ Columna derecha: posts destacados (hasta 6, mismo alto, recorte + hover, bot\u00f3n Ver m\u00e1s)\n    const posts=(x.top_posts||[]).slice(0,6);\n    let right='<div class=\"col-h\">Top posts<\/div>';\n    if(posts.length){\n      right+='<div class=\"tops\">'+\n        posts.map(p=>{ const dot=sentColor(p.sent||x.sent); const r=shortRole(p.type,p.role), rFull=roleLabel(p.type,p.role); const full=p.text||\"\"; const link=p.url?'<a class=\"top-link\" href=\"'+esc(p.url)+'\" target=\"_blank\" rel=\"noopener\">ver \u2197<\/a>':'';\n          return '<div class=\"top\" title=\"'+esc(full)+'\"><div class=\"top-head\"><span class=\"top-dot\" title=\"'+esc((SENTC[p.sent||x.sent]||SENTC.mixto).l)+'\" style=\"background:'+dot+'\"><\/span>'+\n            '<strong>'+esc(p.author||\"\u2014\")+'<\/strong>'+(r?'<span class=\"top-role\" title=\"'+esc(rFull)+'\">'+esc(r)+'<\/span>':'')+'<span class=\"top-net\" title=\"'+esc(NET[p.network]||p.network||\"\")+'\">'+(netIcon(p.network)||esc(NET[p.network]||p.network||\"\"))+'<\/span>'+\n            '<span class=\"top-impact\">'+((p.impact||0).toLocaleString(\"es-ES\"))+' impact<\/span>'+link+'<\/div><div class=\"top-text\">'+esc(full)+'<\/div><\/div>'; }).join(\"\")+'<\/div>'+\n        '<button class=\"ver-mas\" id=\"vermas\" type=\"button\">See more<\/button>';\n    } else {\n      right+='<p class=\"wt-empty\" style=\"font-size:14px;color:var(--muted);margin-top:12px\">No top posts for this topic.<\/p>';\n    }\n    detail.innerHTML=head+desc+'<div class=\"pos-grid\"><div class=\"pos-left\">'+left+'<\/div><div class=\"pos-right\">'+right+'<\/div><\/div>';\n    document.getElementById(\"back\").onclick=()=>goLevel2(t);\n    const vm=document.getElementById(\"vermas\"); if(vm) vm.onclick=()=>showContactPopup(x.label);\n    Array.prototype.forEach.call(detail.querySelectorAll(\".pconcept\"),el=>{ el.setAttribute(\"role\",\"button\"); el.setAttribute(\"tabindex\",\"0\"); el.onclick=()=>showContactPopup(el.textContent); el.onkeydown=ev=>{ if(ev.key===\"Enter\"||ev.key===\" \"){ ev.preventDefault(); showContactPopup(el.textContent); } }; });\n    window.scrollTo({top:0,behavior:\"smooth\"});\n  }\n  function goLevel1(){ st.level=1; st.theme=null; st.sub=null; render(); }\n  function goLevel2(t){ st.level=2; st.theme=t; st.sub=null; render(); }\n  function goLevel3(x){ st.level=3; st.sub=x; render(); }\n\n  Array.prototype.forEach.call(document.querySelectorAll(\".wt-tree .schip\"),c=>{\n    c.onclick=()=>{ st.filter=c.getAttribute(\"data-f\");\n      Array.prototype.forEach.call(document.querySelectorAll(\".wt-tree .schip\"),b=>{ const on=b===c;\n        b.style.background=on?\"#1F2547\":\"#fff\"; b.style.color=on?\"#fff\":\"var(--ink)\"; b.style.borderColor=on?\"#1F2547\":\"var(--line)\";\n        const d=b.querySelector(\".cdot\"); if(d)d.style.background=on?\"#fff\":\"#1F2547\"; });\n      render(); };\n  });\n  const _def = document.querySelector('.wt-tree .schip[data-f=\"todos\"]');\n  if (_def) _def.click();\n\n  (function(){\n    const root=document.querySelector(\".wt-tree\"); if(!root) return;\n    function setHot(g,on){ Array.prototype.forEach.call(root.querySelectorAll('.split [data-g]'),el=>{ if(el.getAttribute('data-g')===g) el.classList.toggle('hot',on); }); }\n    root.addEventListener('mouseover',e=>{ const t=e.target.closest&&e.target.closest('.split [data-g]'); if(t)setHot(t.getAttribute('data-g'),true); });\n    root.addEventListener('mouseout', e=>{ const t=e.target.closest&&e.target.closest('.split [data-g]'); if(t)setHot(t.getAttribute('data-g'),false); });\n  })();\n\n  \/* Popup \"Contacta con Vinces\" al pulsar una cuenta activa *\/\n  function ensureModal(){\n    let m=document.getElementById(\"watsModal\"); if(m) return m;\n    m=document.createElement(\"div\"); m.className=\"wt-modal\"; m.id=\"watsModal\"; m.setAttribute(\"role\",\"dialog\"); m.setAttribute(\"aria-modal\",\"true\"); m.setAttribute(\"aria-hidden\",\"true\");\n    m.innerHTML='<div class=\"box\"><h4>Contact Vinces<\/h4><p id=\"watsModalMsg\"><\/p><div class=\"acts\"><a class=\"cta\" href=\"https:\/\/vincesconsulting.com\/contacto\/\" target=\"_blank\" rel=\"noopener\">Request a demo<\/a><button class=\"x\" type=\"button\">Cerrar<\/button><\/div><\/div>';\n    document.body.appendChild(m);\n    m.addEventListener(\"click\",e=>{ if(e.target===m||e.target.classList.contains(\"x\")) closeModal(); });\n    document.addEventListener(\"keydown\",e=>{ if(e.key===\"Escape\") closeModal(); });\n    return m;\n  }\n  function closeModal(){ const m=document.getElementById(\"watsModal\"); if(m){ m.classList.remove(\"open\"); m.setAttribute(\"aria-hidden\",\"true\"); } }\n  function showContactPopup(name){\n    const m=ensureModal();\n    m.querySelector(\"#watsModalMsg\").innerHTML='For more information or a demo of your report, contact Vinces.';\n    m.classList.add(\"open\"); m.setAttribute(\"aria-hidden\",\"false\");\n  }\n  (function(){\n    const tEl=document.getElementById(\"topents\"); if(!tEl) return;\n    function hit(e){ return e.target.closest&&e.target.closest(\"li.ent-row[data-ent]\"); }\n    tEl.addEventListener(\"click\",e=>{ const li=hit(e); if(li) showContactPopup(li.getAttribute(\"data-ent\")); });\n    tEl.addEventListener(\"keydown\",e=>{ if(e.key!==\"Enter\"&&e.key!==\" \") return; const li=hit(e); if(li){ e.preventDefault(); showContactPopup(li.getAttribute(\"data-ent\")); } });\n  })();\n  \/* CTA banner siempre visible bajo el gr\u00e1fico \u2192 modal de contacto *\/\n  (function(){\n    const b=document.getElementById(\"wtCtaBtn\"); if(b) b.addEventListener(\"click\",()=>showContactPopup());\n  })();\n\n  function load() {\n    loadDashboardData(DEFAULT_API_URL, data => {\n      renderSeoTables(data);\n      updateMeta(data);\n      setUpdatedPill(data, null);\n      const rep = data.report;\n      if (!rep || !rep.themes || !rep.themes.length) {\n        THEMES = [];\n        if (canvas) canvas.innerHTML = '<p class=\"wt-empty\">Sin informe tem\u00e1tico disponible todav\u00eda.<\/p>';\n        return;\n      }\n      THEMES = rep.themes;\n      softenThemes();\n      if (st.theme) { const nt = THEMES.filter(t => t.id === st.theme.id)[0]; st.theme = nt || null; if (!nt) { st.level = 1; st.sub = null; } }\n      renderChips(); render();\n    }, (msg, kind) => {\n      setUpdatedPill(null, kind === \"network\" ? \"Connection error\" : kind === \"http\" ? \"HTTP error\" : \"Error\");\n      if (canvas) canvas.innerHTML = '<p class=\"wt-empty\" style=\"color:#C0392B\">No se pudieron cargar los datos.<\/p>';\n    });\n  }\n\n  const absUrl = `${window.location.protocol}\/\/${window.location.host}\/api\/dashboard-publico\/wats\/`;\n  bindDownloadExternalHtml(absUrl);\n  load();\n  setInterval(load, REFRESH_MS);\n})();\n<\/script>\n\n\n\n<script>\n(function(){\n  function wrapHeroRight(){\n    return; \/* hero ya estructurado con .vc-hero-actions + rueda *\/\n    var pill = document.getElementById('updated-pill');\n    var cta = document.querySelector('.vc-hero-cta');\n    if (!pill || !cta || cta.parentNode.classList.contains('vc-hero-right')) return;\n    var wrap = document.createElement('div');\n    wrap.className = 'vc-hero-right';\n    cta.parentNode.insertBefore(wrap, cta);\n    wrap.appendChild(pill);\n    wrap.appendChild(cta);\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', wrapHeroRight);\n  } else {\n    wrapHeroRight();\n  }\n})();\n<\/script>\n\n<\/body><\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>WATS: conversation topics of the political parties \u00b7 Social intelligence \u00b7 Vinces WATS \u00b7 Social intelligence What are the people who matter to you saying? WATS answers What Are They Saying?: what associations, opinion leaders, decision-makers and other key actors say about the topics that concern you. It analyses public conversation on social media and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4958,"parent":11881,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-11032","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/pages\/11032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/comments?post=11032"}],"version-history":[{"count":0,"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/pages\/11032\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/pages\/11881"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/media\/4958"}],"wp:attachment":[{"href":"https:\/\/vincesconsulting.com\/en\/wp-json\/wp\/v2\/media?parent=11032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}